【问题标题】:WPF semi cascading listboxWPF 半级联列表框
【发布时间】:2010-10-31 12:17:16
【问题描述】:

我的页面上有 3 个控件

  • 列表框A
  • 列表框 B
  • 组合框 C

ListBox A 被数据绑定到项目 A 的集合

ComboBox C 被数据绑定到项目 C 的集合

ListBox B 被数据绑定到 B 项的集合

B 引用了 Item A 和 Item C,ListBox B 应该只显示 Item A 是 ListBox A 的选中项,Item C 是 ListBox C 的选中项的项目

我在ListBox B上将collectionviews作为ItemSource设置了一个过滤器,但我只能让它根据ListBox A或ComboBox C更新ListBox B的内容,而不是同时更新它们.

有什么想法吗?

【问题讨论】:

    标签: c# wpf data-binding xaml


    【解决方案1】:

    在您的视图模型中,给 CollectionView 一个过滤谓词,如下所示:

    Items = CollectionViewSource.GetDefaultView(_Items) as CollectionView;
    Items.Filter = (x => ((Item)x).CategoryA == SelectedCategoryA 
                    && ((Item)x).CategoryC == SelectedCategoryC);
    

    将列表/组合框的SelectedItem 绑定到SelectedCategoryASelectedCategoryC 属性。在这些属性的设置器中,调用Items.Refresh()

    编辑

    在您的列表框中,同时绑定ItemsSourceSelectedItem,例如

    <ListBox ItemsSource="{Binding CategoryListA}"
             SelectedItem="{Binding SelectedCategoryA, Mode=TwoWay}"/>
    

    在您的视图模型中,创建如下属性:

    private Category _SelectedCategoryA;
    
    public Category SelectedCategoryA
    {
       get { return _SelectedCategoryA; }
       set
       {
          if (value != _SelectedCategoryA)
          {
             _SelectedCategoryA = value;
             Items.Refresh();
          }
       }
    }
    

    【讨论】:

    • 能否详细说明如何绑定selecteditem并调用items.refresh?
    【解决方案2】:

    一种解决方案是从 b 类型的公共访问器属性集合中创建项目 B 的单独集合。像这样。

    private List<B> m_trueCollection; //the actual collection of B
    public ObservableCollection<B> FilteredB { get; set; } //bind to this
    

    然后,使用SelectionChanged Event 属性监听 Co​​mboBox C 或 Listbox A 的选定项何时发生变化。

    如果选择更改,则迭代真实集合并根据您的条件重建 FilteredB。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多