是否可以在样式中设置WPF ComboBox的Items属性?

时间:2017-11-01 11:46:37

标签: c# wpf combobox

我在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>

但是我收到“值设置不止一次”的错误。我以为我需要将项目包装到某种集合容器中,但我无法弄清楚是什么。这甚至可以吗?

我意识到我可以为此制作一个简单的自定义控件,但如果它不能用于某种风格,我想要更好地理解为什么。

1 个答案:

答案 0 :(得分:2)

设置ItemsSource属性而不是Items。如果您使用布尔值的集合,也不需要SelectedValueSelectedValuePath

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>