我有一个简单的 ViewModel,例如:
public class MainViewModel
{
ObservableCollection<Project> _projects;
public MainViewModel()
{
// Fill _projects from DB here...
ProjectList.Source = _projects;
ProjectList.Filter = ...;
}
public CollectionViewSource ProjectList { get; set; }
}
我在构造函数中将窗口的 DataContext 设置为该 ViewModel 的新实例:
public MainWindow() {
this.DataContext = new MainViewModel();
}
然后在 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
接口的实现,但在制作时要小心。如果你不实现它,很容易出现内存泄漏。