在WPF MVVM中过滤ObservableCollection

Sam*_*mal 3 c# wpf datagrid mvvm

我有一个绑定ObservableCollection的数据网格.有一个状态字段.单击过滤器按钮时,我需要按状态过滤.我使用MVVM并需要在VM类中进行过滤.

<DataGrid
    CanUserResizeColumns="False" CanUserResizeRows="False" IsEnabled="{Binding IsKeySet}"
    Name="dgwTemplateDetails" CanUserAddRows="False" SelectionMode="Single"
    ItemsSource="{Binding OrderTemplateList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    AutoGenerateColumns="False" Width="auto" FontWeight="Normal" FontStyle="Normal">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Act Code" Width="75" Binding="{Binding ActCode}" IsReadOnly="True"/>
        <DataGridTextColumn Header="Act Name" Width="*" Binding="{Binding ActName}" IsReadOnly="True"/>
        <DataGridTextColumn Header="No. Of Days" Width="80" Binding="{Binding NoOfDays}"/>
        <DataGridTemplateColumn Header="To be Finish Date" Width="110" IsReadOnly="True">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding EarStartDt, StringFormat=dd/MM/yyyy, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <DatePicker SelectedDate="{Binding EarStartDt, StringFormat=dd/MM/yyyy, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Act Status" Width="100" Binding="{Binding ActStatus}" IsReadOnly="True"/>
        <DataGridTextColumn Header="Remarks" Width="200" Binding="{Binding Remarks}" IsReadOnly="True"/>
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

bli*_*eis 14

我会使用ICollectionView进行过滤.

public ICollectionView MyView {get; private set;}
Run Code Online (Sandbox Code Playgroud)

所以在你的ctor中你可以这样做:

 MyView = CollectionViewSource.GetDefaultView(OrderTemplateList);
 MyView.Filter = MyFilterAction;
Run Code Online (Sandbox Code Playgroud)

因此,当您的"button_ClickCommand"在Viewmodel中设置新状态时,您只需调用即可

MyView.Refresh();
Run Code Online (Sandbox Code Playgroud)

并将重新评估您的过滤器