使用ICollectionView过滤ObservableCollection

Nig*_*ker 2 c# data-binding wpf xaml mvvm

我已经ObservableCollection绑定了dataGrid,现在我想过滤所显示的数据,我看到我需要使用,ICollectionView但我不知道如何添加ICollectionView我的MVVM模式.

我的代码简化了以下内容:

public class MainViewModel : ViewModelBase , IBarcodeHandler
{
    public ObservableCollection<TraceDataItem> TraceItemCollectionViewSource { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的XAML

    <Window xmlns:controls="clr-namespace:Mentor.Valor.vManage.RepairStation.Controls"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            <DataGrid Grid.Row="2" ColumnWidth="*"  ItemsSource="{Binding TraceItemCollectionViewSource , Mode=TwoWay , UpdateSourceTrigger=PropertyChanged}" RowStyle="{StaticResource TraceRowStyle}"  IsReadOnly="True" Name="TraceDataGrid" Margin="5,5,5,5" Padding="5,5,5,5" AutoGenerateColumns="False">
    </Window>
Run Code Online (Sandbox Code Playgroud)

我如何ICollectionView在此添加以便对视图应用过滤?

And*_*tar 5

你需要:

public class MainViewModel : ViewModelBase, IBarcodeHandler
{
    public ICollectionView TraceItemCollectionView
    {
        get { return CollectionViewSource.GetDefaultView(TraceItemCollectionViewSource); }
    }

    public ObservableCollection<TraceDataItem> TraceItemCollectionViewSource { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,在代码中的某个地方(可能在构造函数中)添加您的过滤器:

TraceItemCollectionView.Filter = o =>
{
    var item = (TraceDataItem) o;

    //based on item, return true if it should be visible, or false if not

    return true;
};
Run Code Online (Sandbox Code Playgroud)

而且,在XAML中,您需要将绑定更改为TraceItemCollectionView属性.

  • @Andrew如果使用集合的默认视图,则无需更改xaml绑定.直接绑定到集合与绑定到默认视图相同(ItemsControl在绑定到集合时始终绑定到默认视图). (3认同)