Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Не получается привязаться к List<>


Автор: ДобренькийПапаша 26.5.2011, 11:15
Нашёл у нас же аналогичный пример, но тут с классом http://forum.vingrad.ru/topic-317693.html

Код

 <ListView Name="BankNotesCaptured" Grid.Row="1" Margin="25,5,25,25" HorizontalAlignment="Center">
                <ListView.View>
                    <GridView>
                        <GridView.Columns>
                            <GridViewColumn Width="120" Header="Номинал (руб)" DisplayMemberBinding="{Binding Path=BankNotesNominals}"></GridViewColumn>
                            <GridViewColumn Width="120" Header="Количество"></GridViewColumn>
                            <GridViewColumn Width="120" Header="Цена"></GridViewColumn>
                        </GridView.Columns>
                    </GridView>
                </ListView.View>
            </ListView>


Код

public partial class Deposition : Window
    {
        private List<string> bankNotesNominals = new List<string>() {"10", "50", "100" };
        private List<int> coinsNominals = new List<int>() { 1, 2, 5, 10 };

        public List<string> BankNotesNominals { get { return bankNotesNominals; } }
        public List<int> CoinsNominals { get { return coinsNominals; } }

        public Deposition()
        {
            InitializeComponent();
            DataContext = this;
        }


Привязка не происходит.

Автор: -Mikle- 26.5.2011, 12:08
А где привязка ItemsSource? И объясни еще, что такое BankNotesNominals и CoinsNominals. Они в одной строке ListView должны отображаться? Если да, то их надо объединить в каком-нить классе (допустим MyData), в Deposition хранить список List<MyData>. ListView.ItemsSource должна привязываться к свойству с этим списком, а DisplayMemberBinding должна привязываться к свойствам класса MyData.

Автор: ДобренькийПапаша 26.5.2011, 12:14
Нет, другой дженерик в другом листвью отображается.
Мне надо тупо привязать значения из одного List<> к <ListView Name="BankNotesCaptured".

Автор: -Mikle- 26.5.2011, 12:20
В любом случае надо прописать привязку в ItemsSource.

Автор: ДобренькийПапаша 26.5.2011, 12:34
Так я и не пойму, что в ItemsSource указывать. Если укажу коллекцию, то заполняются все столбцы не нужными мне значениями. Мне нужно заполнить только первый столбец.

Автор: -Mikle- 26.5.2011, 13:49
Сделай как я написал выше. Определи класс с нужными свойствами (то бишь колонками). Затем инициализируй список экземплярами этого класс, но установи только одно свойство, остальные у тебя как я понял, будут заполняться пользователем. Из этого же списка потом и прочитаешь заполненный результат.

Автор: ДобренькийПапаша 26.5.2011, 15:26
Привязал вот так. Привязанные данные отображает правильно, но зачем-то в двух других колонках выводит "SubwayTicketService.Deposition+NoteNominals"
Код

<ListView Name="BankNotesCaptured" Grid.Row="1" Margin="25,5,25,25" HorizontalAlignment="Center" ItemsSource="{Binding MoneyNoteNominals}">
                <ListView.View>
                    <GridView>
                        <GridView.Columns>
                            <GridViewColumn Width="120" Header="Номинал (руб)" DisplayMemberBinding="{Binding Path=Note}"></GridViewColumn>
                            <GridViewColumn Width="120" Header="Количество"></GridViewColumn>
                            <GridViewColumn Width="120" Header="Цена"></GridViewColumn>
                        </GridView.Columns>
                    </GridView>
                </ListView.View>
            </ListView>


Код

public partial class Deposition : Window
    {
        private List<NoteNominals> nominals = new List<NoteNominals>();
        public List<NoteNominals> MoneyNoteNominals
        {
            get { return nominals; }
        }

        public class NoteNominals
        {
            private int note;
            public int Note
            {
                get { return note; }
            }
            public NoteNominals(int note)
            {
                this.note=note;               
            }
        }

        public Deposition()
        {
            InitializeComponent();
            DataContext = this;
            FillNominals();
        }

        private void FillNominals()
        {
            nominals.Add(new NoteNominals(10));
            nominals.Add(new NoteNominals(50));
            nominals.Add(new NoteNominals(100));
        }
}

Автор: -Mikle- 26.5.2011, 20:01
В классе NoteNominals определи еще два свойства: количество и цена. Затем сделай привязку к ним в тех двух колонках. В данный момент, привязка осуществлена ко всему объекту и так как DasplayMemeberPath не указан, то вызывается метод ToString у всего объекта, чей результат и показывается в этих колонках.

Автор: ДобренькийПапаша 27.5.2011, 07:42
Ну так я сразу мог сделать. Я так не хотел, ибо показалось как-то громоздко. Хотел попроще. Ну, предположим я так и сделал. Так писать значения во вторую колонку и третью теперь нельзя будет напрямую как-то? Только через свойства класса?

Автор: -Mikle- 27.5.2011, 15:36
Что значит напрямую? Из кода?

Автор: ДобренькийПапаша 27.5.2011, 20:09
Думал, можно будет обойтись без классов дополнительных. А вообще, в результате я сделал ObservableCollection, реализовал INotifyPropertyChanged. В общем, всё работает и ладно smile
Спасибо за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)