我有一个从我的viewmodel数据绑定到observablecollection的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>
我尝试过使用复合集合,但似乎没有用。有没有办法实现这个目标?
提前致谢!
答案 0 :(得分:4)
CompositeCollection
应该有效,如果你知道如何使用它;关于它的一个重要的事情是它不继承DataContext
,这意味着您需要以其他方式引用您的源,如果该方法是x:Reference
您可以不创建循环引用,可以通过将集合放在引用的元素的Resources中来避免这种情况。 e.g。
<Window.Resources>
<CompositeCollection x:Key="compCollection">
<ComboBoxItem Content="-- All Models --"/>
<CollectionContainer Collection="{Binding MyCollection, Source={x:Reference Window}}"/>
</CompositeCollection>
...
</Window.Resources>
然后您可以通过ItemsSource="{StaticResource compCollection}"
。
答案 1 :(得分:2)
将视图交互逻辑构建到viewmodel中。我的建议是使Observable集合类型为由源列表填充的viewmodel,再加上一个“未选择”项目的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 }));
}
}
然后您可以使用null sematic处理SelectedItem的Id。
答案 2 :(得分:0)
您可以将收藏品通用类型更改为object
并添加 - 所有模型 - 事物。