2011-06-22 113 views
2

我有一个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; 
    } 

哪里是我的错?

+0

我只是做是 - 如果(List_ListBoxItems.Count == 1) ListBox_BinsRegion.DataContext = List_ListBoxItems; ListBox_BinsRegion.Items.Refresh(); 现在它可以工作.... –

+0

这也适用,如果您更喜欢使用可观察集合。 –

回答

6

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; 
+1

如果他删除了DataContext行,那么ListBox将不会有任何项目。 – CodeNaked

+0

基于在集合上触发的CollectionChanged事件的WPF更新。如果你的集合没有实现INotifyCollectionChanged接口,WPF集合将不会动态更新。 –

+0

现在我看到了这个问题,非常感谢你 –

0

使用一个ObservableCollection <>,而不是一个列表<>。这将更新自动绑定,无需以下行(可以是一种缓慢的)

ListBox_BinsRegion.DataContext = List_ListBoxItems; 
+0

他仍然需要在ListBox上设置数据上下文。没有它的项目源绑定到集合将无法工作。 –

+1

是的,但他不需要在每次向列表框中添加内容时执行此操作。 – MattS423

1

你不应该改变控制的DataContext的,而不是设置绑定到theList_ListBoxItems并使其公开属性,并使用ObservableCollection或BindableCollection代替列表

2

当您第二次分配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); 
} 
0

你既可以做什么其他人已经建议(使用一个ObservableCollection而不是列表) - 或者你可以查询其绑定的依赖项属性,并找到相应的绑定和手动刷新它。

我会去的的ObservableCollection :)