繁体   English   中英

对XAML中的非绑定数据使用IValueConverter

[英]Using an IValueConverter on non bound data in XAML

我编写了一个IValueConverter来处理WPF元素中的本地化和转换。

public class LanguageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return string.Empty;

        if (value is string)
            return LocalizedStrings.Retreive((string)value);
        else
            return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

但是我也想在非绑定数据中使用它,即将已知字符串发送到转换器中,而不是从元素数据上下文中发送属性。 我该怎么办?

猜猜我应该澄清一下,我的意图是在XAML中将其用于UI,如果它还具有设计时间支持,将很有帮助。

我确实尝试过使用ConverterParameter来输入源字符串的变体,但是在设计时,我的所有文本都被System.Object文本替换了,所以不是很有用。

还要尽可能避免创建重载或继承的用户控件。

您可以创建将string作为参数的MarkupExtension ,然后在ProvideValue覆盖中调用您的转换器。 这是一个示例实现:

public class TranslateExtension : MarkupExtension
{
    public TranslateExtension(string text)
    {
        Text = text;
    }

    private static readonly LanguageConverter _converter = new LanguageConverter();

    public string Text { get; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return _converter.Convert(Text, null, null, null);
    }
}

然后,您将在XAML中像这样使用它:

<TextBlock Text="{local:Translate 'text to translate'}" />

请注意,尽管更改语言将要求重新读取XAML,因为仅在实现XAML定义ProvideValue方法。 如果您希望采用动态方法,则可以参考答案。

但是我也想在非绑定数据中使用它,即将已知字符串发送到转换器中,而不是从元素数据上下文中发送属性。 我该怎么办?

您实际上无法做到这一点,因为仅在解析到source属性的绑定以及更新source属性时才调用Converter的Convert方法。 如果与source属性的绑定失败,例如,当您在XAML标记中定义了无效的绑定路径时,或者根本没有要绑定的DataContext时,将不会调用Convert方法。

而且,如果根本没有将绑定应用于目标属性,则转换器也不会被调用。

因此,您必须始终确保确实存在要绑定的属性才能起作用。 也许您可以绑定到虚拟属性或其他东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM