У меня проблемы с реализацией пользовательского объекта DependencyObject:
Мне нужен конвертер, который устанавливает или отменяет флаг перечисления в связанном свойстве. Поэтому я создал IValueConverter, извлеченный из FrameworkElement с двумя DependencyProperties: Flag (флаг, который устанавливается / отменяется конвертером) и Flags (значение / свойство, которое нужно изменить). Родительский UserControl (Name = EnumerationEditor) предоставляет свойство, к которому привязан конвертер.
ListBox генерирует CheckBox и экземпляры конвертера, которые используются для изменения свойства с помощью DataTemplate. Каждый экземпляр CheckBox / конвертер используется для одного флага. Я использую следующий код XAML:
<ListBox Name="Values" SelectionMode="Extended" BorderThickness="1" BorderBrush="Black" Padding="5">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type system:Enum}">
<DataTemplate.Resources>
<Label x:Key="myTestResource" x:Shared="False"
Content="{Binding}"
ToolTip="{Binding Path=Value, ElementName=EnumerationEditor}"
Foreground="{Binding Path=Background, ElementName=EnumerationEditor}"
Background="{Binding Path=Foreground, ElementName=EnumerationEditor}"/>
<converters:EnumerationConverter x:Key="EnumerationConverter" x:Shared="False"
Flag="{Binding}"
Flags="{Binding Path=Value, ElementName=EnumerationEditor}"/>
</DataTemplate.Resources>
<StackPanel Orientation="Horizontal">
<CheckBox Content="{Binding}" IsChecked="{Binding Path=Value, ElementName=EnumerationEditor, Converter={StaticResource EnumerationConverter}}"/>
<ContentPresenter Content="{StaticResource myTestResource}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Странная вещь: Метка работает нормально - но конвертер - нет. Я получаю ошибку:
System.Windows.Data Ошибка: 4: не удается найти источник для привязки со ссылкой «ElementName = EnumerationEditor». BindingExpression: Path = Value; DataItem = NULL; Целевым элементом является EnumerationConverter (Name = ''); Свойство target - Flags (тип Enum)
Я не понимаю, почему привязка в основном такая же ...
Вот код для конвертера:
public class EnumerationConverter : FrameworkElement, IValueConverter
{
#region IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Parity.Space;
}
#endregion
#region public Enum Flag { get; set; }
public Enum Flag
{
get { return (Enum)this.GetValue(EnumerationConverter.FlagProperty); }
set { this.SetValue(EnumerationConverter.FlagProperty, value); }
}
/// <summary>
/// Dependency property for Flag.
/// </summary>
public static readonly DependencyProperty FlagProperty = DependencyProperty.Register("Flag", typeof(Enum), typeof(EnumerationConverter));
#endregion
#region public Enum Flags { get; set; }
public Enum Flags
{
get { return (Enum)this.GetValue(EnumerationConverter.FlagsProperty); }
set { this.SetValue(EnumerationConverter.FlagsProperty, value); }
}
/// <summary>
/// Dependency property for Flags.
/// </summary>
public static readonly DependencyProperty FlagsProperty = DependencyProperty.Register("Flags", typeof(Enum), typeof(EnumerationConverter));
#endregion
}