仅显示一项的列表框

本文关键字:一项 列表 显示 | 更新日期: 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:)