Вы должны указать конвертер в своей декларации привязки, но вы можете сделать это внутри.
Я набросал это:
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
, вместо наследования:
XAML:
<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>
code- позади:
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
.
«UserControl, который наследуется от ComboBox» - пользовательские элементы управления предназначены для * агрегации * других элементов управления вместо их наследования. – Dennis
Я не понял, что вы подразумеваете под третьим абзацем –
Я только что редактировал мой вопрос, чтобы сделать его более ясным – MxFragz