如何将ToggleButtons绑定到ItemsControl上的枚举值?

时间:2014-10-23 21:42:04

标签: data-binding enums itemscontrol togglebutton

我想为枚举值创建一行ToggleButtons。按钮必须显示MyEnumType属性的当前值(按其状态),并在按下时更改属性的值。

我找到了将一堆独立的CheckBox绑定到相应的枚举值(每个一个)here的解决方案,但是我试图通过ItemsControl创建ToggleButtons(来自枚举类型的值)所以我不必记得每次向枚举类型添加另一个值时添加一个ToggleButton(以及创建按钮的更短的XAML代码)。问题是我无法绑定ConverterParameter 。有没有一个干净,正确的方法来做到这一点?或者我做错了什么?

现在是我的代码:

<ItemsControl ItemsSource="{Binding Source={local:EnumValues {x:Type local:MyEnumType}}}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ToggleButton Content="{Binding Converter={StaticResource MyEnumToNiceStringConverter}}" 
                IsChecked="{Binding Source=mySourceObject, Path=SelectedMyEnumValue, Converter={StaticResource EnumBooleanConverter}, ConverterParameter={Binding}}">
            </ToggleButton>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

local:EnumValuesMarkupExtension,它返回给定枚举类型的值列表。 EnumBooleanConverter是来自上述链接的值转换器,如果绑定的枚举值等于其ConverterParameter并且支持ConvertBack从bool到枚举值,则返回true。 SelectedMyEnumValue是按钮要反映和修改的属性。

对我来说这是一个重复的问题(某些属性不能被绑定)所以如果你要为ToggleButtons提供一个完全不同的方法,请写下如何解决这种绑定的问题。它不必永远绑定,我只需要设置一次值(在XAML中没有一堆样式和触发器代码)。也许另一个标记扩展可以做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

我发现我的问题与this one重复(我对其标题感到困惑并错过了它)。非常遗憾。我根据该帖子的答案(使用ListBox而不是ItemsControl并将IsChecked绑定到IsSelected)为我的特定案例附加解决方案。这里的主要技巧是隐藏所选项目的蓝色背景的风格。

<ListBox ItemsSource="{Binding Source={local:EnumValues {x:Type local:MyEnumType}}}"
         SelectedItem="{Binding Source=mySourceObject, Path=SelectedMyEnumValue}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <ContentPresenter />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.Resources>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ToggleButton Content="{Binding Converter={StaticResource MyEnumToNiceStringConverter}}" 
                IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}">
            </ToggleButton>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

无论如何,这只解决了我的两个问题之一,所以如果您知道如何将ConverterParameter等属性绑定,请留下答案。感谢。