仅显示一项的列表框
本文关键字:一项 列表 显示 | 更新日期: 2023-09-27 17:59:50
我有一个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;
}
我的错误在哪里?
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;
当您第二次分配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);
}
您不应该更改控件的DataContext,而是将绑定设置为list_ListBoxItems并使其成为公共属性,并使用ObservableCollection或BindableCollection而不是列表
使用ObservableCollection<>而不是列表<>。这将自动更新绑定,不需要下面的行(可能有点慢)
ListBox_BinsRegion.DataContext = List_ListBoxItems;
您可以按照其他人的建议(使用ObservableCollection而不是List),也可以查询绑定的依赖属性,找到相应的Binding并手动刷新。
我会选择ObservableCollection:)