我在WPF中有一个表单需要一些Yes / No组合框,在viewmodel上数据绑定到布尔属性。因此,项目列表是静态的。而不是为每个组合框重复它,我希望以一种风格实现这一点;像这样的东西:
<Style x:Key="trueFalseCombo" TargetType="{x:Type ComboBox}" BasedOn="{StaticResource ComboBoxStyle}">
<Setter Property="SelectedValuePath" Value="Tag"/>
<Setter Property="Items">
<Setter.Value>
<ComboBoxItem Tag="{StaticResource True}">Yes</ComboBoxItem>
<ComboBoxItem Tag="{StaticResource False}">No</ComboBoxItem>
</Setter.Value>
</Setter>
</Style>
但是我收到“值设置不止一次”的错误。我以为我需要将项目包装到某种集合容器中,但我无法弄清楚是什么。这甚至可以吗?
我意识到我可以为此制作一个简单的自定义控件,但如果它不能用于某种风格,我想要更好地理解为什么。
答案 0 :(得分:2)
设置ItemsSource
属性而不是Items
。如果您使用布尔值的集合,也不需要SelectedValue
和SelectedValuePath
。
xmlns:sys="clr-namespace:System;assembly=mscorlib"
...
<Style x:Key="trueFalseCombo" TargetType="ComboBox">
<Setter Property="ItemsSource">
<Setter.Value>
<x:Array Type="sys:Boolean">
<sys:Boolean>True</sys:Boolean>
<sys:Boolean>False</sys:Boolean>
</x:Array>
</Setter.Value>
</Setter>
</Style>
为了显示Yes和No而不是True和False,您可以像这样使用ItemTemplate:
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding}" Value="True">
<Setter Property="Text" Value="Yes"/>
</DataTrigger>
<DataTrigger Binding="{Binding}" Value="False">
<Setter Property="Text" Value="No"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>