Wpf 绑定到ViewModel上CollectionViewSource属性的XAML
我有一个简单的ViewModel,如:Wpf 绑定到ViewModel上CollectionViewSource属性的XAML,wpf,xaml,binding,Wpf,Xaml,Binding,我有一个简单的ViewModel,如: public class MainViewModel { ObservableCollection<Project> _projects; public MainViewModel() { // Fill _projects from DB here... ProjectList.Source = _projects; ProjectList.Filter = ...; }
public class MainViewModel {
ObservableCollection<Project> _projects;
public MainViewModel() {
// Fill _projects from DB here...
ProjectList.Source = _projects;
ProjectList.Filter = ...;
}
public CollectionViewSource ProjectList { get; set; }
}
然后在Xaml中,我试图将ListBox的ItemsSource绑定到该ProjectList属性
像这样仅绑定ItemsSource不起作用:
<ListBox ItemsSource="{Binding ProjectList}" ItemTemplate="..." />
但是,如果我首先重新设置DataContext的基础,这是可行的:
<ListBox DataContext="{Binding ProjectList}" ItemsSource="{Binding}" ItemTemplate="..." />
第一种方法不应该正常工作吗?我可能做错了什么?如果您使用的是
CollectionViewSource
您需要将ItemsSource
绑定到ProjectList。View
而不是ProjectList
。这应该可以解决您的问题。根据您提供的第一种方法,它应该可以完美地工作。魔鬼潜伏在细节的某个地方
PS:也许您没有为了文章大小而指定
INotifyPropertyChanged
接口的实现,但是在生产中要小心。如果不实现它,很容易获得数据。您是同步还是异步地从数据库获取数据?同步地,如果是竞争条件,那么第二种方法也不起作用…所以我想我也不能像那样复制我的问题。。。我已经用ViewModel的“真实”外观更新了问题。请参阅我的更新答案。我不太清楚为什么CollectionViewSource是这样工作的,但这是我一直与他们合作的方式。谢谢,这很有帮助。这是我第一次使用CollectionViewSource。我最终创建了属性类型ICollectionView
,在getter中,我从私有CollectionViewSource返回视图
属性。这样,我就不必担心绑定到.View
,如果我将来更改该ViewModel属性的集合类型,该绑定就会中断。是的,它确实实现了该接口。如果您愿意,可以称之为测试用例。
<ListBox DataContext="{Binding ProjectList}" ItemsSource="{Binding}" ItemTemplate="..." />