Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 为什么CompositeCollection不可冻结?_Wpf_Freezable_Compositecollection - Fatal编程技术网

Wpf 为什么CompositeCollection不可冻结?

Wpf 为什么CompositeCollection不可冻结?,wpf,freezable,compositecollection,Wpf,Freezable,Compositecollection,我正在使用MVVM模式编写一个应用程序。我通过将视图的DataContext属性设置为ViewModel的实例来向视图提供数据。一般来说,我只是从那里使用绑定,然后按照自己的方式进行 最近,我尝试在ViewModel提供的集合之外实现一个带有“额外”元素的组合框,该集合表示“选择项” 选择项 问题是,CompositeCollection不是可冻结的:。这将导致仅显示静态ComboBoxItem,而不显示来自绑定表达式的任何结果 我对这个问题的最初反应是实现我自己的可自由化的Composit

我正在使用MVVM模式编写一个应用程序。我通过将视图的DataContext属性设置为ViewModel的实例来向视图提供数据。一般来说,我只是从那里使用绑定,然后按照自己的方式进行

最近,我尝试在ViewModel提供的集合之外实现一个带有“额外”元素的组合框,该集合表示“选择项”


选择项
问题是,CompositeCollection不是可冻结的:。这将导致仅显示静态ComboBoxItem,而不显示来自绑定表达式的任何结果

我对这个问题的最初反应是实现我自己的可自由化的CompositeCollection版本。然而,这引出了以下问题:

为什么CompositeCollection一开始不是一个可免费使用的工具?

我担心的是,通常这些决定都是有原因的,我觉得我对Freezable了解不够,无法解释为什么他们没有继承Freezable。我知道我可以实现这个集合,但我担心如果我这样做的话,性能会有明显的差异

任何帮助都将不胜感激。谢谢

另外:请注意,我意识到我可以插入空值或其他特殊值,并提供和模板或valueconverter来执行我想要的操作。这不是我感兴趣的问题。。。只有上面黑体字的问题

更新:

在阿森姆克特的评论引发了一些进一步的研究之后,我相信这实际上是一个疏忽。证据如下:

  • 有一个名为
    FreezableCollection
    的集合是可冻结的。它不生成CollectionView,这使得它不适合直接满足我的需要
  • MSFT的山姆·本特(Sam Bent)在上述链接中也这么说。我还找不到他的联系方式,但如果有机会,我打算和他讨论一下
  • 我目前解决这个问题的计划是创建一个具有CompositeCollection和
    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