【发布时间】:2014-10-13 16:22:54
【问题描述】:
我想知道如何将布尔属性绑定到组合框。组合框将是一个是/否组合框。
【问题讨论】:
我想知道如何将布尔属性绑定到组合框。组合框将是一个是/否组合框。
【问题讨论】:
您可以使用 ValueConverter 将布尔值转换为 ComboBox 索引并返回。像这样:
public class BoolToIndexConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value == true) ? 0 : 1;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((int)value == 0) ? true : false;
}
}
}
假设 Yes 在索引 0 上,No 在索引 1 上。那么您必须使用该转换器绑定到 SelectedIndex 属性。为此,您在资源部分声明您的转换器:
<Window.Resources>
<local:BoolToIndexConverter x:Key="boolToIndexConverter" />
</Window.Resources>
然后你在绑定中使用它:
<ComboBox SelectedIndex="{Binding YourBooleanProperty, Converter={StaticResource boolToIndexConverter}}"/>
【讨论】:
我发现自己过去曾为此使用 ComboBox 项的 IsSelected 属性。此方法完全在 xaml 中。
<ComboBox>
<ComboBoxItem Content="No" />
<ComboBoxItem Content="Yes" IsSelected="{Binding YourBooleanProperty, Mode=OneWayToSource}" />
</ComboBox>
【讨论】:
SelectedIndex 来强制使用默认值,例如<ComboBox SelectedIndex="0">
第一个解决方案是用复选框替换“是/否”组合框,因为复选框的存在是有原因的。
第二种解决方案是用真假对象填充组合框,然后将组合框的“SelectedItem”绑定到布尔属性。
【讨论】:
这是一个示例(将启用/禁用替换为是/否):
<ComboBox SelectedValue="{Binding IsEnabled}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={x:Static converters:EnabledDisabledToBooleanConverter.Instance}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.Items>
<system:Boolean>True</system:Boolean>
<system:Boolean>False</system:Boolean>
</ComboBox.Items>
</ComboBox>
这里是转换器:
public class EnabledDisabledToBooleanConverter : IValueConverter
{
private const string EnabledText = "Enabled";
private const string DisabledText = "Disabled";
public static readonly EnabledDisabledToBooleanConverter Instance = new EnabledDisabledToBooleanConverter();
private EnabledDisabledToBooleanConverter()
{
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Equals(true, value)
? EnabledText
: DisabledText;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
//Actually won't be used, but in case you need that
return Equals(value, EnabledText);
}
}
而且无需使用索引。
【讨论】: