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
}
...
我有 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
}
...