True False Null ComboBox
本文关键字:ComboBox Null False True | 更新日期: 2023-09-27 18:04:44
我正在努力开发WPF中的一个组件。这是我的问题:
我有一个bool?属性,我想绑定到一个组合框的SelectedValue。我的ComboBox应该有3个选项:"是"(bool == true),"否"(bool == false),"(bool == null)。
我创建了一个继承自ComboBox的UserControl。在构造函数中,我用所需的值("Yes"/"No"/")填充了ItemCollection。
后台代码:public class YesNoNullComboBox : RadComboBox
{
public YesNoNullComboBox()
{
this.Items.Add("Yes");
this.Items.Add("No");
this.Items.Add(string.Empty);
}
}
XAML: <utils:YesNoNullComboBox SelectedValue="{Binding BoolValue}" />
我设法得到一些操作我想要的方式,但为此,我不得不使用转换器。因此,我有一个UserControl和一个Converter添加到我的XAML。
我想设置我的UserControl默认使用转换器,但我没有弄清楚如何…这可能吗?还是有更好的方法?
ValueConverters的目的是绑定两个具有不兼容类型的属性。这里你想把一个布尔值变成一个字符串。隐式强制转换为string会给你"true"或"false",但不是你想要的字符串。
在我看来ValueConverters是最好的和最简单的解决方案,您的情况。
您必须在绑定声明中指定转换器,但是您可以在中使用。
我已经画好了:
1)一个辅助类,用于存储在ComboBox
和转换器中操作的字符串值:
public static class ThreeStateComboBoxItemsSource
{
public const string None = "(none)";
public const string Yes = "Yes";
public const string No = "No";
public static readonly string[] ItemsSource = new[]
{
None,
Yes,
No
};
}
2)转换器:
[ValueConversion(typeof(bool?), typeof(string))]
public sealed class NullableBoolToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return ThreeStateComboBoxItemsSource.None;
return (bool)value ? ThreeStateComboBoxItemsSource.Yes : ThreeStateComboBoxItemsSource.No;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch ((string)value)
{
case ThreeStateComboBoxItemsSource.Yes:
return true;
case ThreeStateComboBoxItemsSource.No:
return false;
default:
return null;
}
}
}
3)用户控制。我不希望用户能够覆盖CombeBox
的行为(例如,设置另一个ItemsSource
),我已经将CB
包装到UserControl
中,而不是继承:
<UserControl x:Class="WpfApplication4.ThreeStateComboBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApplication4"
mc:Ignorable="d">
<UserControl.Resources>
<local:NullableBoolToStringConverter x:Key="NullableBoolToStringConverterKey"/>
</UserControl.Resources>
<ComboBox x:Name="InnerComboBox"
SelectedItem="{Binding Value, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Converter={StaticResource NullableBoolToStringConverterKey}}"
ItemsSource="{x:Static local:ThreeStateComboBoxItemsSource.ItemsSource}"/>
</UserControl>
后台代码:
public partial class ThreeStateComboBox : UserControl
{
public ThreeStateComboBox()
{
InitializeComponent();
}
public bool? Value
{
get { return (bool?)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
"Value",
typeof(bool?),
typeof(ThreeStateComboBox),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
}
4)使用示例:
<local:ThreeStateComboBox Value="{Binding MyProperty1}"/>
由于转换器是在用户控制中使用的,你不需要在其他地方使用它,只需要将bool
/bool?
属性绑定到Value
。