我可以从xaml过滤集合吗?

我有一个wpf-mvvm应用程序。

我的viewmodel中有一个可观察的集合

public ObservableCollection ImportMessageList { get; set; } 

“BatchImportResultMessageDto”包含两个属性..

结果类型和消息。 结果类型可以是成功或失败。

我需要在一个列表框中显示成功..而在另一个列表框中显示失败。

我可以这样做..在viewmodel中有2个可观察的集合来保存成功/失败。

 public ObservableCollection ImportFailureMessageList { get; set; } // To hold the failure messages. public ObservableCollection ImportSuccessMessageList { get; set; } // To hold the sucess messages. 

但还有其他更好的方法,以便我可以过滤它(没有新的两个集合)?

您可以使用CollectionViewSource并使其成为视图模型的属性,并直接从XAML绑定到它而不是ImportMessageList集合。 将ImportMessageList集合设置为CollectionViewSource的Source,然后配置谓词以对CollectionViewSource过滤。

就像是:

 private ICollectionView messageListView; public ICollectionView MessageListView { get { return this.messageListView; } private set { if (value == this.messageListView) { return; } this.messageListView = value; this.NotifyOfPropertyChange(() => this.MessageListView); } } ... this.MessageListView = CollectionViewSource.GetDefaultView(this.ImportMessageList); this.MessageListView.Filter = new Predicate(this.FilterMessageList); ... public bool FilterMessageList(object item) { // inspect item as message here, and return true // for that object instance to include it, false otherwise return true; } 

您可以通过创建两个CollectionViewSource对象并在每个对象上设置filter来完成此操作。

如何从VM绑定( 源 )在xaml中创建CVS:

           

如何在后面的代码中过滤CVS(如果您不想对其进行引用,可以使用reflection来查看模型的属性。 来源 ):

  

与(代码背后)

 void MyCVS_Filter(object sender, FilterEventArgs e) { CultureInfo item = e.Item as CultureInfo; if (item.IetfLanguageTag.StartsWith("en-")) { e.Accepted = true; } else { e.Accepted = false; } }