[英]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.