Wpf 绑定到ViewModel上CollectionViewSource属性的XAML

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 = ...; }

我有一个简单的ViewModel,如:

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="..." />