【问题标题】:wpf collectionviewsource in viewmodel or xaml code-behindviewmodel 或 xaml 代码隐藏中的 wpf collectionviewsource
【发布时间】:2013-09-18 09:26:11
【问题描述】:

我正处于这个困境中,希望有人可以帮助我

抱歉,我无法将代码粘贴到此处作为公司块发布在这里。

我正在尝试在 xaml 中使用 collectionviewsource。我尝试了两种方法,静态资源和 cvs.source。第一个效果很好,但限制是我只能从代码隐藏中找到资源。但控制 ui 和显示 ui 不在同一个视图上,我不知道如何触发排序/过滤 所以我转向第二个选项,我将 cvs 放在视图模型中,并将属性暴露给两个 ui。但我得到了这个著名的错误“试图改变不属于这个线程的用户界面”

所以一般来说,把 csv 放在哪里的好习惯是什么。我检查了很多地方建议第二个选项http://www.xamlplayground.org/post/2009/07/18/Use-CollectionViewSource-effectively-in-MVVM-applications.aspxXAML Binding to a CollectionViewSource property on a ViewModel,但似乎没有人提到 ui 线程所有权问题。我是不是在做一些非常愚蠢的事情

谢谢

【问题讨论】:

  • CollectionViewSource 旨在用于 XAML。您正在 ViewModel 中寻找CollectionView
  • 为什么你只能从代码隐藏中找到[静态]资源?当然,声明 StaticResource 的全部意义在于您可以在 XAML 中引用它?
  • @Sheridan,我有两个 ui 和两个代码隐藏。我如何将事件/命令从一个 ui 路由到另一个 ui?我看到的大部分示例代码,代码隐藏都很轻。
  • @HighCore,你是对的。您甚至可以在不在 xaml 或后台代码中声明 collectionviewsource 的情况下获得 collectionview。每个集合对象都有默认视图

标签: c# wpf xaml mvvm collectionviewsource


【解决方案1】:

如果您一直遇到线程问题,请使用Dispatcher

Application.Current.Dispatcher.Invoke(
  new Action(() => /* modify the collection */));

或者使用 EnableCollectionSynchronization 方法,它是 WPF 4.5 中的新方法,并且会为您做同样的事情:

private static object syncObject = new object();
//...
BindingOperations.EnableCollectionSynchronization(yourCollection, syncObject);

阅读更多相关信息here

【讨论】:

  • EnableCollectionSynchronization 的编码示例+1。
  • 感谢您的建议,我将看看 EnableCollectionSynchronization。但我不喜欢每次遇到问题时都引入新技术,因为我相信这是非常常见的用例,而且我是 wpf 的新手。只想拥有基本权利
猜你喜欢
  • 2011-04-21
  • 2010-11-03
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多