CollectionViewSource 代码隐藏绑定 MVVM 的奇怪行为

Strange behavior of CollectionViewSource code-behind binding MVVM

我有 MainWindow.xaml(视图)和 MainWindowViewModel.cs(视图模型)。 在我的程序中,我在 Worklist.Result (observablecollection) 中自定义 class 以在启动时异步加载数据。此时我需要使用自定义过滤数据。如果我在 xaml 中创建 CollectionViewSource,所有显示都完美,但我无法将 Filter 事件绑定到 CollectionViewSource。好的,然后我需要代码隐藏 CollectionView ......但最后 DataGrid 不显示数据(没有绑定错误,CollectionViewSource 有所有记录)。为什么? 示例1:(XAML-created CollectionViewSource w/o过滤)一切OK!
MainWindow.xaml

...
        <xdg:DataGridCollectionViewSource x:Key="DataItems"
                                Source="{Binding WorkList.Result}" 
        <xdg:DataGridCollectionViewSource.GroupDescriptions>
            <xdg:DataGridGroupDescription PropertyName="Date"/>
        </xdg:DataGridCollectionViewSource.GroupDescriptions>
    </xdg:DataGridCollectionViewSource>-->
...
  <xdg:DataGridControl VerticalAlignment="Stretch" Background="White" ItemsSource="{Binding Source={StaticResource DataItems}}" ... </xdg:DataGridControl>

示例 2:(CodeBehind 创建的 CollectionViewSource w/o 过滤)DataGrid 中没有记录!):

MainWindow.xaml

<xdg:DataGridControl VerticalAlignment="Stretch" Background="White" ItemsSource="{Binding DataItems}" ... </xdg:DataGridControl>

MainWindowViewModel.cs

...
public ICollectionView DataItems { get; private set; }
...
private void WorkList_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
                DataItems = CollectionViewSource.GetDefaultView(WorkList.Result);

        }

然后 WorkList_PropertyChanged 事件引发了 CollectionViewSource 中的所有数据,但没有引发 DataGrid 中的所有数据。有人可以帮忙解决这个问题吗?

为了让 WPF 引擎知道 DataItems 已更新为新值, 您的 DataItems 需要通知 PropertyChanged

即使 CollectionViewSource.GetDefaultView(WorkList.Result); 的结果是一个 ObservableCollection,视图也不知道它,因为没有 DataItems 已更新的通知。

确保您的 MainWindowViewModel 实现了 INotifyPropertyChanged,您可以:

...
private ICollectionView _dataItems;
public ICollectionView DataItems { 
  get
  {
    return this._dataItems;
  }
  private set 
  {
    this._dataItems = value;
    this.OnPropertyChanged("DataItems"); // Update the method name to whatever you have
  }
...