我正在使用MVVM模式编写一个应用程序。我将视图的DataContext属性设置为ViewModel的实例,从而向视图提供数据。通常,我只是从那里使用绑定,然后按我的方式走。
最近,我尝试在我的ComboBox提供的集合"Select“之外实现一个”额外“元素的ViewModel。
<ComboBox>
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="False">Select Item</ComboBoxItem>
<CollectionContainer Collection="{Binding MyItemsCollection}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>问题是,CompositeCollection不是一个可冻结的:可冻结对象概述。这只会导致静态ComboBoxItem出现,而不显示绑定表达式的结果。
我对这个问题的最初反应是只实现我自己版本的可冻结的CompositeCollection。然而,这就引出了以下问题:
为什么CompositeCollection一开始就不能冻结呢?
我担心的是,这些决定通常都是有原因的,我觉得我对“冻结”的了解还不够,不能说为什么他们没有继承它。我知道我可以实现这个集合,但是我担心如果我这样做,性能会有很大的不同。
任何帮助都将不胜感激。谢谢!
另外:请注意,我意识到我可以插入一个空值或其他一些特殊值,并提供和模板或值转换器来做我想做的事情。这不是我感兴趣的问题。只有上面粗体的问题。
更新:
在阿瑟·姆克特的评论所带来的进一步研究之后,我被引导相信这实际上是一个疏忽。证据是:
FreezableCollection<T>。它不产生CollectionViews,这使得它直接不适合我的需要。我当前解决这个问题的计划是使用CompositeCollection和FreezableCollection<T>属性创建一个新集合。我不知道它会不会起作用,但我在想这样的事情:
public class BindableCompositeCollection : FreezableCollection<object>, ICollectionViewFactory如果有人有更好的选择,我想听听!
发布于 2009-09-17 03:38:47
我今晚试过了:
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;
}
}
}<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,我可以使用。对于我正在开发的应用程序来说,这将非常有用。:(
https://stackoverflow.com/questions/1189052
复制相似问题