【问题标题】:XAML Binding to a CollectionViewSource property on a ViewModelXAML 绑定到 ViewModel 上的 CollectionViewSource 属性
【发布时间】:2011-03-01 20:50:23
【问题描述】:

我有一个简单的 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="..." />

第一种方法不应该正常工作吗?我可能做错了什么?

【问题讨论】:

  • 您是同步还是异步从数据库中获取数据?
  • 同步,如果它是一个竞争条件,那么第二种方法也不起作用......

标签: wpf xaml binding


【解决方案1】:

如果您使用CollectionViewSource,则需要将ItemsSource 绑定到ProjectList.View 而不是ProjectList。这应该可以解决您的问题。

【讨论】:

  • 所以我想我也不能像那样复制我的问题......我已经用 ViewModel“真正”的样子更新了这个问题。
  • 查看我的更新答案。我不确定为什么 CollectionViewSource 会以这种方式工作,但这是我一直不得不与他们合作的方式。
  • 谢谢,这很有帮助。这是我第一次使用 CollectionViewSource。我最终创建了属性类型ICollectionView,并在getter 中从私有CollectionViewSource 返回了View 属性。这样我就不必担心绑定到.View,如果我将来更改该 ViewModel 属性的集合类型,它会中断。
【解决方案2】:

根据您提供的第一种方法应该可以正常工作。魔鬼潜伏在细节的某个地方。

PS:也许你没有指定INotifyPropertyChanged接口的实现是为了帖子大小,但在生产中要小心。如果你不实现它,很容易得到memory leak

【讨论】:

  • 是的,它确实实现了那个接口。如果你愿意,可以称之为测试用例。
猜你喜欢
  • 2017-01-23
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多