我想为枚举值创建一行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:EnumValues
是MarkupExtension
,它返回给定枚举类型的值列表。
EnumBooleanConverter
是来自上述链接的值转换器,如果绑定的枚举值等于其ConverterParameter并且支持ConvertBack从bool到枚举值,则返回true。
SelectedMyEnumValue
是按钮要反映和修改的属性。
对我来说这是一个重复的问题(某些属性不能被绑定)所以如果你要为ToggleButtons提供一个完全不同的方法,请写下如何解决这种绑定的问题。它不必永远绑定,我只需要设置一次值(在XAML中没有一堆样式和触发器代码)。也许另一个标记扩展可以做到这一点?
谢谢!
答案 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等属性绑定,请留下答案。感谢。