我可以从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
您可以通过创建两个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; } }