【发布时间】:2014-12-19 16:53:44
【问题描述】:
我想为 Enum 值创建一行 ToggleButtons。 按钮必须显示 MyEnumType 属性的当前值(按其状态),并在按下时更改该属性的值。
我找到了一种解决方案,可以将一堆单独的 CheckBox 绑定到它们对应的枚举值(每个一个)here,但我正在尝试通过 ItemsControl(从 Enum 类型的值)创建 ToggleButtons,所以我每次我向我的枚举类型添加另一个值(以及创建按钮的更短的 XAML 代码)时,都不必记住添加一个 ToggleButton。问题是我无法绑定 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:EnumValues 是一个 MarkupExtension,它返回给定 Enum 类型的值列表。
EnumBooleanConverter 是来自上述链接的值转换器,如果绑定的枚举值等于其 ConverterParameter 并支持从 bool 到枚举值的 ConvertBack,则返回 true。
SelectedMyEnumValue 是按钮要反映和修改的属性。
这对我来说是一个重复的问题(某些属性无法绑定),所以如果你要给我一个完全不同的 ToggleButtons 方法,还请写下如何解决这种绑定问题。它不必永远绑定,我只需要设置一次值(在 XAML 中没有一堆 Style-and-Triggers 类型的代码)。也许另一个标记扩展可以做到这一点?
谢谢!
【问题讨论】:
-
PS:我还尝试了一个将绑定值与属性值进行比较的 MultiBinding,它几乎可以正常工作。正确的按钮一开始是按下的,但是当您单击另一个按钮时,前一个按钮没有上升(即使 MultiBinding 从每个按钮获取值以进行比较并且返回 false - 我已经通过断点检查了这一点)。也许你知道为什么?
标签: data-binding enums itemscontrol togglebutton