ListBox представляет только один элемент - PullRequest
2 голосов
/ 22 июня 2011

У меня есть ListBox и класс со строками. Каждый раз, когда пользователь нажимает кнопку добавления в приложении, я создаю новый экземпляр класса и добавляю его в список, который связан с ListBox. При первом нажатии кнопки добавления в списке отображается первый элемент, но в следующий раз не отображаются два элемента.

XAML - это ListBox:

<ListBox Name="ListBox_BinsRegion" Height="181" Margin="233,16,6,94" Width="253" Background="Transparent" BorderThickness="1" BorderBrush="Black" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemsSource="{Binding}"/> 

Код позади:

List<Class_ListViewItem> List_ListBoxItems = new List<Class_ListViewItem>();

 private void Button_Add_Click(object sender, RoutedEventArgs e)
    {
        Class_ListViewItem item = new Class_ListViewItem();
        item.WH = this.comboBox_WareHouseBinsRegionDefinition.SelectedItem.ToString();
        item.XXFrom = textBox_XXFrom.Text;
        item.XXTo = textBox_XXTo.Text;
        item.YYFrom = textBox_YYFrom.Text;
        item.YYTo = textBox_YYTO.Text;
        item.Z = textBox_ZFrom.Text;

        List_ListBoxItems.Add(item);

        ListBox_BinsRegion.DataContext = List_ListBoxItems;
    }

Где моя ошибка?

Ответы [ 5 ]

6 голосов
/ 22 июня 2011

WPF не знает, когда меняется ваша коллекция.Проблема здесь:

List<Class_ListViewItem> List_ListBoxItems = new List<Class_ListViewItem>();

вам нужно изменить список на

ObservableCollection<Class_ListViewItem> List_ListBoxItems = new ObservableCollection<Class_ListViewItem>();

ObservableCollection (System.Collections.ObjectModel) генерирует событие при изменении коллекции, так что WPFможно обновить список.

Также вы можете удалить следующую строку или переместить ее в конструктор элемента управления.

ListBox_BinsRegion.DataContext = List_ListBoxItems;
2 голосов
/ 22 июня 2011

Когда вы назначаете DataContext во второй раз, он технически не изменяется. Это потому, что вы присваиваете его той же коллекции. Вы должны сделать что-то вроде этого:

ObservableCollection<Class_ListViewItem> List_ListBoxItems = new ObservableCollection<Class_ListViewItem>();

public YourControl() {
    InitializeComponent();
    ListBox_BinsRegion.DataContext = List_ListBoxItems;
}

private void Button_Add_Click(object sender, RoutedEventArgs e)
{
    Class_ListViewItem item = new Class_ListViewItem();
    item.WH = this.comboBox_WareHouseBinsRegionDefinition.SelectedItem.ToString();
    item.XXFrom = textBox_XXFrom.Text;
    item.XXTo = textBox_XXTo.Text;
    item.YYFrom = textBox_YYFrom.Text;
    item.YYTo = textBox_YYTO.Text;
    item.Z = textBox_ZFrom.Text;

    List_ListBoxItems.Add(item);
}
1 голос
/ 22 июня 2011

Вы не должны изменять DataContext элемента управления, вместо этого установите привязку в theList_ListBoxItems и сделайте ее публичным свойством, а вместо списка используйте набор ObservableCollection или BindableCollection

0 голосов
/ 22 июня 2011

Вы можете либо сделать то, что другие уже предложили (используя ObservableCollection вместо списка), либо вы можете запросить свойство зависимости, которое связано, найти соответствующую привязку и обновить его вручную.пойти на ObservableCollection:)

0 голосов
/ 22 июня 2011

Используйте ObservableCollection <>, а не List <>. Это автоматически обновит привязку без необходимости в следующей строке (которая может быть медленной)

ListBox_BinsRegion.DataContext = List_ListBoxItems;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...