【问题标题】:Bind ObservableCollection as source for different CollectionViewSource将 ObservableCollection 绑定为不同 CollectionViewSource 的源
【发布时间】:2013-03-27 16:21:59
【问题描述】:

我有一个名为myCollectionObservableCollection<MyClass> 应该绑定到两个CollectionViewSources(AllItemsSelectedItems)。

AllItems 的源属性绑定到myCollectionSelectedItems 的源属性应该绑定到 myCollection 的项目 IsSelected == true

public class MyClass : INotifyPropertyChanged
{
    //fields and interface implementations
    public string Name {//proper code};
    public bool? IsSelected {//proper code};
}

// some where else in the MainWindow
AllItems.Source = myCollection;
SelectedItems.Source = myCollection.Where(input=>input.IsSelected==true);

问题: 加载 Window 时一切正常。但是,当myCollection 中某些项目的IsSelected 值发生更改时,显然它对SelectedItems 没有影响。因此,为了克服这个问题,我每次更改 IsSelected 属性时都会更新 SelectedItems 的源属性。

问题:如何进行此类绑定,从而无需手动更新SelectedItems 的源属性?

感谢。

【问题讨论】:

    标签: c# wpf binding observablecollection collectionviewsource


    【解决方案1】:

    首先,您应该无条件地删除您的手动过滤设置,并将其替换为更合适的设置。替换什么的选择主要取决于您所针对的 .NET 版本。

    如果面向 .NET 4.5,那么一个简单的解决方案是在集合视图上启用 live filtering

    对于早期版本的 .NET,无论如何您都必须做一些手动工作,但最好只在重新绑定控件的集合视图上调用 Refresh。为此,您应该通过从 XAML 设置 Filter 事件处理程序,将过滤推迟到集合视图本身。

    【讨论】:

      【解决方案2】:

      MyClass 发生更改后,您应该提出PropertyChanged Event

      如果您已经这样做了,那么您应该在调试模式下查看您的SelectedItems.Source。也许它已经存在正确的值但它没有显示给你。

      我的意思是如果SelectedItems.Source 属于一些可见的元素——GUI——你应该在屏幕上刷新它。因为在另一种情况下,值是存在的,但在重新绘制屏幕上的元素之前不会显示。

      【讨论】:

      • @HosseinNarimaniRad - 你应该试试我在调试模式下的建议
      • 答案是这样的:没有办法自动更新,我得在正确的地方做一些刷新。
      • 是的,这就是答案。我已将其发布为答案-您必须刷新
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      相关资源
      最近更新 更多