Wpf Comboxbox可选默认项
我有一个comboxbox,它是一个来自我的viewmodel的observablecollection的数据绑定。我可以让我的列表填充数据,但我也想添加一个默认项目,如“--All Models--”。下面的代码显示“--All Models--”作为默认项目,但如果您选择另一个项目则无法选择。Wpf Comboxbox可选默认项
<ContentControl Content="{Binding Items}">
<ContentControl.ContentTemplate>
<DataTemplate>
<Grid>
<ComboBox x:Name="cb" ItemsSource="{Binding}"/>
<TextBlock x:Name="tb" Text="--Choose One--" IsHitTestVisible="False" Visibility="Hidden"/>
</Grid>
<DataTemplate.Triggers>
<Trigger SourceName="cb" Property="SelectedItem" Value="{x:Null}">
<Setter TargetName="tb" Property="Visibility" Value="Visible"/>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
我试过了compositecollection,但似乎没有工作。有没有办法做到这一点?
在此先感谢!
将视图交互逻辑构建到视图模型中。我的建议使Observable集合类型为由源列表填充的视图模型,再加上另一个“未选定”项目的viewmodel。
像
public class ItemViewModel
{
public string Description { get; set; }
public int Id { get; set; }
}
public class ViewModel : ViewModelBase
{
public ObservableCollection<ItemViewModel> Items { get; set; } // Bound to ContentControl
private void Init()
{
Items = new ObservableCollection<ItemViewModel>();
Items.Add(new ItemViewModel() { Description = "--choice one--" , Id = null });
Items.AddRange(Model.Items.Select(i=> new ItemViewModel() { Description = i.Description , Id = i.Id }));
}
}
然后你就可以处理的SelectedItem的ID与空思迈特。
您可以将您的集合通用类型更改为object
并在那里添加 - 所有模型 - 的东西。
CompositeCollection
应该工作,如果你知道如何使用它;一个重要的事情是它不继承DataContext
,这意味着你需要引用你的来源以其他方式,进一步如果该方法是x:Reference
你可能不会创建一个循环引用,这可以通过放置在引用的元素的资源中收集。例如
<Window.Resources>
<CompositeCollection x:Key="compCollection">
<ComboBoxItem Content="-- All Models --"/>
<CollectionContainer Collection="{Binding MyCollection, Source={x:Reference Window}}"/>
</CompositeCollection>
...
</Window.Resources>
然后你可以通过ItemsSource="{StaticResource compCollection}"
来使用它。
这是一个更简洁的答案。从MVVM的角度来看更清晰。 – Oliver 2012-02-17 09:07:41
我怀疑这是一个可行的选择... – 2011-04-22 15:05:30