【问题标题】:ListBox presenting only one itemListBox 仅显示一项
【发布时间】:2011-06-22 12:29:17
【问题描述】:

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

我的错误在哪里?

【问题讨论】:

  • 我刚刚做的是 - if (List_ListBoxItems.Count == 1) ListBox_BinsRegion.DataContext = List_ListBoxItems; ListBox_BinsRegion.Items.Refresh();现在可以使用了....
  • 如果你更喜欢使用 observable 集合,这也可以。

标签: c# .net wpf xaml listbox


【解决方案1】:

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 行,那么 ListBox 将没有任何项目。
  • WPF 更新基于在集合上触发的 CollectionChanged 事件。如果您的集合未实现 INotifyCollectionChanged 接口,则 WPF 集合将不会动态更新。
  • 如果这解决了问题,请将其标记为答案。谢谢!
【解决方案2】:

您不应更改控件的 DataContext,而是将绑定设置为 theList_ListBoxItems 并将其设为公共属性,并使用 ObservableCollection 或 BindableCollection 而不是列表

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      使用 ObservableCollection 而不是 List。这将自动更新绑定,无需以下行(可能有点慢)

      ListBox_BinsRegion.DataContext = List_ListBoxItems;
      

      【讨论】:

      • 他还需要在ListBox上设置数据上下文。没有它,项目源绑定到集合将不起作用。
      • 是的,但他不需要每次往列表框中添加东西时都这样做。
      【解决方案5】:

      您可以执行其他人已经建议的操作(使用 ObservableCollection 而不是 List) - 或者您可以查询绑定的依赖属性并找到相应的 Binding 并手动刷新它。

      我会选择 ObservableCollection :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多