具有相关性属性的值转换器
本文关键字:转换器 属性 相关性 | 更新日期: 2023-09-27 18:03:52
我在实现自定义DependencyObject:时遇到问题
我需要一个在绑定属性中设置或取消设置枚举标志的转换器。因此,我创建了一个从FrameworkElement派生的IValueConverter,它有两个DependencyProperty:Flag(由转换器设置/取消设置的标志(和Flags(要修改的值/属性(。父UserControl(Name=EnumerationEditor(提供转换器绑定到的属性。
ListBox生成复选框和转换器实例,用于通过DataTemplate修改属性。每个复选框/转换器实例用于一个标志。我使用以下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=值;DataItem=null;目标元素是"EnumerationConverter"(名称="(;目标属性为"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
}
转换器不是FrameworkElement
,因此它不应该从该类继承,最多使用DependencyObject
。
由于转换器不在任何绑定不起作用的树中,您可以尝试:
<converters:EnumerationConverter x:Key="EnumerationConverter" x:Shared="False"
Flag="{Binding}"
Flags="{Binding Path=Value, Source={x:Reference EnumerationEditor}}"/>
(然而,这应该放在UserControl
的Resources
中并被引用,否则x:Reference
将导致循环依赖性错误。(
注意,Flag
绑定尝试绑定到可能不起作用的DataContext
,因为DataContext
可能不被继承,原因与ElementName
和RelativeSource
将不起作用相同。
结论
我决定使用两个UserControls来解决这个问题;FlagControl和EnumerationEditorControl。
FlagControl有两个依赖属性
- Flag(System.Enum(:确定控件设置/清除的标志
- 值(System.Enum(:绑定到设置/清除标志的属性/值
EnumerationEditorControl有一个依赖属性:
- Value(System.Enum(:设置标志的属性/值
EnumerationEditorControl使用DataTemplate来实例化FlagControls。DataTemplate将FlagControl.Flag属性与DataContext绑定,将FlagControl.Value属性与EnumerationEditorControl.Values属性绑定。
通过这种方式,我不需要转换器,而且逻辑是清晰分离的。
感谢您的建议、评论和回复!