我有一个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 :(得分: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 :(得分: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);
}
答案 2 :(得分:1)
您不应更改控件的DataContext,而是将绑定设置为List_ListBoxItems并使其成为公共属性,并使用ObservableCollection或BindableCollection而不是list
答案 3 :(得分:0)
使用ObservableCollection&lt;&gt;而不是List&lt;&gt;。这将自动更新绑定,不需要以下行(可能有点慢)
ListBox_BinsRegion.DataContext = List_ListBoxItems;
答案 4 :(得分:0)
您可以执行其他人已经建议的操作(使用ObservableCollection而不是List) - 或者您可以查询绑定的依赖项属性并找到相应的Binding并手动刷新它。
我会选择ObservableCollection:)