Wpf 为什么CompositeCollection不可冻结?
我正在使用MVVM模式编写一个应用程序。我通过将视图的DataContext属性设置为ViewModel的实例来向视图提供数据。一般来说,我只是从那里使用绑定,然后按照自己的方式进行 最近,我尝试在ViewModel提供的集合之外实现一个带有“额外”元素的组合框,该集合表示“选择项”Wpf 为什么CompositeCollection不可冻结?,wpf,freezable,compositecollection,Wpf,Freezable,Compositecollection,我正在使用MVVM模式编写一个应用程序。我通过将视图的DataContext属性设置为ViewModel的实例来向视图提供数据。一般来说,我只是从那里使用绑定,然后按照自己的方式进行 最近,我尝试在ViewModel提供的集合之外实现一个带有“额外”元素的组合框,该集合表示“选择项” 选择项 问题是,CompositeCollection不是可冻结的:。这将导致仅显示静态ComboBoxItem,而不显示来自绑定表达式的任何结果 我对这个问题的最初反应是实现我自己的可自由化的Composit
选择项
问题是,CompositeCollection不是可冻结的:。这将导致仅显示静态ComboBoxItem,而不显示来自绑定表达式的任何结果
我对这个问题的最初反应是实现我自己的可自由化的CompositeCollection版本。然而,这引出了以下问题:
为什么CompositeCollection一开始不是一个可免费使用的工具?
我担心的是,通常这些决定都是有原因的,我觉得我对Freezable了解不够,无法解释为什么他们没有继承Freezable。我知道我可以实现这个集合,但我担心如果我这样做的话,性能会有明显的差异
任何帮助都将不胜感激。谢谢
另外:请注意,我意识到我可以插入空值或其他特殊值,并提供和模板或valueconverter来执行我想要的操作。这不是我感兴趣的问题。。。只有上面黑体字的问题
更新:
在阿森姆克特的评论引发了一些进一步的研究之后,我相信这实际上是一个疏忽。证据如下:
FreezableCollection
的集合是可冻结的。它不生成CollectionView,这使得它不适合直接满足我的需要FreezableCollection
属性的新集合。我不知道它是否会起作用,但我正在考虑这样的事情:
public class BindableCompositeCollection : FreezableCollection<object>, ICollectionViewFactory
公共类BindableCompositeCollection:FreezableCollection,ICollectionViewFactory
如果有人有更好的选择,我愿意听 我今晚刚试过这个:
公共类状态
{
公共字符串代码{get;set;}
公共字符串名称{get;set;}
}
公共类MyWindowViewModel
{
ObservableCollection _states=新的ObservableCollection
{
新州{Code=“FL”,Name=“Florida”},
新州{Code=“CA”,Name=“California”},
};
公共可观测收集状态
{
得到
{
返回状态;
}
}
}
这里的关键是创建一个服务定位器实例作为静态资源,然后通过它访问viewmodel。服务定位器可以使用Unity或任何您想要的DI连接到ViewModel的实例
编辑:
实际上,在我的silverlight应用程序中,我在app.xaml中将服务定位器创建为静态资源,然后将我的其他UserControls/Windows/Pages DataContext绑定到服务定位器的ViewModel属性。即使在App.xaml的资源中实例化了服务定位器,它对组合框的工作方式也应该是相同的。我希望有一个silverlight版本的CompositeCollection可以使用。这对我正在开发的应用程序非常有用(这可能会有帮助吗?也许……它似乎包含了一位MSFT员工说这是一个bug。很有趣。这样做会让我感觉好一点。不过,我想看看是否有人对性能有任何担忧。将此作为一个答案记录下来,以便如果这一切都是因为有人忽略了这一点,我可以给予你信任cenario for CompositeCollection。这与本文概述的基本问题相同,但适用的解决方法相同:。就我个人而言,我更喜欢“间谍”技巧。根据马龙·格雷奇博客上最近的一些建议,我们一直打算走这条路。我将在上午尝试!
public class BindableCompositeCollection : FreezableCollection<object>, ICollectionViewFactory