具有依赖属性的值转换器

2024-05-21

我在实现自定义 DependencyObject 时遇到问题:

我需要一个转换器来设置或取消设置绑定属性中的枚举标志。因此,我创建了一个从 FrameworkElement 派生的 IValueConverter,它具有两个 DependencyProperties:Flag(由转换器设置/取消设置的标志)和 Flags(要修改的值/属性)。父 UserControl(名称 = 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”的绑定源。绑定表达式:路径=值;数据项=空;目标元素是“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}}"/>

(但是,这应该放在Resources of the UserControl并引用,否则x:Reference http://msdn.microsoft.com/en-us/library/ee795380.aspx将导致循环依赖错误。)

请注意,Flag绑定尝试绑定到DataContext这可能不起作用DataContext出于同样的原因,可能无法继承ElementName and RelativeSource不管用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有依赖属性的值转换器 的相关文章