在 WPF 中将静态 属性 转换为 StaticResource

Converting a static property to a StaticResource in WPF

我想知道是否可以将 class 的静态 属性 转换为静态资源。

我想这样做的原因是因为我制作了一个转换器,可以将枚举的值转换为人类友好的可读格式(将它们翻译成另一种语言)。

因为我不想为每个枚举创建一个转换器,所以我想让事情变得更通用,并使用一个具有两个属性的转换器,枚举类型和要映射的字典 (IDictionary<string, string>)所需输出的枚举。

public class EnumTranslatorConverter : IValueConverter
{

    public Type EnumType { get; set; }
    public IDictionary<string, string> EnumMapping { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return EnumMapping[value.ToString()];
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Enum.Parse(EnumType, value as string);
    }
}

然后我得到了一个定义我的转换器的资源,以便在我的应用程序中更方便地使用它们。

我想为每种类型和映射定义一个转换器,这只是一个概念证明,因为它当然不起作用:

<mappings:DisplayMappings x:Key="displaymappings" />
<my:EnumTranslatorConverter x:Key="DayOfWeekTranslatorConverter" 
    EnumType="{x:Type sys:DayOfWeek}" 
    EnumMapping="{Binding Source={StaticResource displaymappings}, Path=DayOfWeekMapping}" />

EnumType 属性 正在工作。但是 EnumMapping 当然不是,因为它需要静态资源,因为它不是依赖项 属性。

但是如何使用 XAML 将我的映射注入到 属性 中?有什么方法可以从 XAML 中的静态 属性 创建静态资源吗?

静态属性有一个标记扩展:{x:Static}

<my:EnumTranslatorConverter x:Key="DayOfWeekTranslatorConverter" 
     EnumType="{x:Type sys:DayOfWeek}" 
     EnumMapping="{x:Static mappings:DisplayMappings.DayOfWeekMapping}" />

更直接的方法可能是取消单独的映射并使用附加到枚举成员的 [Description("...")] 属性 [(参见 [MSDN])]。

然后在您的转换器中,您可以动态构造映射并通过反映枚举的成员并实例化类型来按类型缓存它。

这样做的好处是您不需要维护单独的字典来映射 Xaml 中的枚举成员名称,这可能会在将来的某个时候与您的枚举成员不同步.