首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么CompositeCollection不能冻结?

为什么CompositeCollection不能冻结?
EN

Stack Overflow用户
提问于 2009-07-27 16:05:57
回答 1查看 4.2K关注 0票数 22

我正在使用MVVM模式编写一个应用程序。我将视图的DataContext属性设置为ViewModel的实例,从而向视图提供数据。通常,我只是从那里使用绑定,然后按我的方式走。

最近,我尝试在我的ComboBox提供的集合"Select“之外实现一个”额外“元素的ViewModel。

代码语言:javascript
复制
<ComboBox>    
    <ComboBox.ItemsSource>    
        <CompositeCollection>
           <ComboBoxItem IsEnabled="False">Select Item</ComboBoxItem>
           <CollectionContainer Collection="{Binding MyItemsCollection}" />    
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

问题是,CompositeCollection不是一个可冻结的:可冻结对象概述。这只会导致静态ComboBoxItem出现,而不显示绑定表达式的结果。

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

为什么CompositeCollection一开始就不能冻结呢?

我担心的是,这些决定通常都是有原因的,我觉得我对“冻结”的了解还不够,不能说为什么他们没有继承它。我知道我可以实现这个集合,但是我担心如果我这样做,性能会有很大的不同。

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

另外:请注意,我意识到我可以插入一个空值或其他一些特殊值,并提供和模板或值转换器来做我想做的事情。这不是我感兴趣的问题。只有上面粗体的问题。

更新:

在阿瑟·姆克特的评论所带来的进一步研究之后,我被引导相信这实际上是一个疏忽。证据是:

  1. 有一个可冻结的集合,称为FreezableCollection<T>。它不产生CollectionViews,这使得它直接不适合我的需要。
  2. MSFT的山姆·本特( Sam )在上面的链接中也说了同样的话。我还没有找到他的联系方式,但如果我有机会的话,我打算和他讨论这个问题。

我当前解决这个问题的计划是使用CompositeCollection和FreezableCollection<T>属性创建一个新集合。我不知道它会不会起作用,但我在想这样的事情:

代码语言:javascript
复制
public class BindableCompositeCollection : FreezableCollection<object>, ICollectionViewFactory

如果有人有更好的选择,我想听听!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-09-17 03:38:47

我今晚试过了:

代码语言:javascript
复制
public class State
{
    public string Code { get; set; }
    public string Name { get; set; }
}

public class MyWindowViewModel
{
    ObservableCollection<State> _states = new ObservableCollection<State>
    {
        new State { Code = "FL", Name = "Florida" },
        new State { Code = "CA", Name = "California" },
    };

    public ObservableCollection<State> States
    {
        get
        {
            return _states;
        }
    }
}
代码语言:javascript
复制
<Window x:Class="WpfApplication1.MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:app="clr-namespace:WpfApplication1"
        Title="Window1"
        Height="300"
        Width="300">

  <Window.Resources>
    <app:ServiceLocator x:Key="Locator" />
  </Window.Resources>

  <StackPanel>
    <ComboBox x:Name="TestCombo" SelectedIndex="0" DisplayMemberPath="Name" SelectedValuePath="Code">
      <ComboBox.ItemsSource>
        <CompositeCollection>
          <app:State Code="" Name="Select a state..." />
          <app:State Code="TX" Name="Texas" />
          <CollectionContainer Collection="{Binding Source={StaticResource Locator}, Path=MyWindowViewModel.States}" />
        </CompositeCollection>
      </ComboBox.ItemsSource>
    </ComboBox>
  </StackPanel>
</Window>

这里的关键是将服务定位器的实例创建为静态资源,然后遍历它以获得视图模型。服务定位器可以使用统一或任何您想要的DI连接到ViewModel实例。

编辑:

实际上,在我的silverlight应用程序中,我将服务定位器创建为App.xaml中的静态资源,然后将其他UserControls/ DataContext /Pages绑定到服务定位器的ViewModel属性。即使服务定位器在App.xaml的资源中被实例化,它仍然应该以同样的方式工作在组合框中。我希望有一个silverlight版本的CompositeCollection,我可以使用。对于我正在开发的应用程序来说,这将非常有用。:(

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1189052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档