【问题标题】:Filtering ObservableCollection in WPF MVVM在 WPF MVVM 中过滤 ObservableCollection
【发布时间】:2015-03-29 19:28:48
【问题描述】:

我有一个绑定 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>

【问题讨论】:

    标签: c# wpf mvvm datagrid


    【解决方案1】:

    我会使用 ICollectionView 进行过滤。

    public ICollectionView MyView {get; private set;}
    

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

     MyView = CollectionViewSource.GetDefaultView(OrderTemplateList);
     MyView.Filter = MyFilterAction;
    

    所以当你的“button_ClickCommand”在你的 Viewmodel 中设置一个新的状态时,你可以简单地调用

    MyView.Refresh();
    

    您的过滤器将被重新评估

    【讨论】:

    • 作为 WPF 的新手,更多的上下文会有所帮助。例如,MyView 应该存在于哪里?是在代码隐藏还是视图模型中?
    • 如果是 MVVM,应该是 Viewmodel
    【解决方案2】:
    ObservableCollection<object> orderTemplateList = new ObservableCollection<object>();
    private bool toFilter;
    ObservableCollection<object> OrderTemplateList
    {
        get
        {
            if (toFilter)
                return orderTemplateList.Where(c => c.Status = FilterStatus);
            else
                return orderTemplateList;
        }
    }
    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        toFilter = !toFilter;
        OnPropertyChanged("OrderTemplateList");
    }
    

    ButtonClick 将在此处成为您的命令处理程序

    【讨论】:

    • 返回 IEnumerable,而不是 ObservableCollection:无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.ObjectModel.ObservableCollection”。存在显式转换(您是否缺少演员表?)
    猜你喜欢
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多