【问题标题】:WPF Value Converter to replace error code with localized stringWPF 值转换器用本地化字符串替换错误代码
【发布时间】:2015-01-09 18:09:03
【问题描述】:

我有一个实现 IDataErrorInfo 接口以进行验证的视图模型,对于错误,它会生成一个字符串,该字符串是资源字典中描述错误的本地化字符串的键。但是,当尝试将以下样式和模板应用于文本框时,我得到红色边框但没有工具提示,但是删除我的转换器并使用默认的转换器会给我工具提示,但显然不是本地化的字符串。

你能看出我做错了什么和/或是否有更好的方法吗?

class MessageCodeToMessageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            string messageCode = (string)value;
            try
            {
                return (string)App.Current.Resources[messageCode];
            }
            catch (Exception)
            {
                return messageCode;
            }
        }
        else
        {
            return null;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return "";
    }
}

        <local:MessageCodeToMessageConverter x:Key="Converter"></local:MessageCodeToMessageConverter>
        <Style x:Key="TextBox" TargetType="TextBox">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent, Converter={StaticResource Converter}}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
        <ControlTemplate x:Key="ErrorTemplate">
            <DockPanel LastChildFill="True">
                <Border BorderBrush="Red" BorderThickness="1">
                    <AdornedElementPlaceholder />
                </Border>
            </DockPanel>
        </ControlTemplate>

【问题讨论】:

  • 您能否显示XAML 代码您的TextBox 在哪里以及如何将样式和模板应用于文本框?
  • 你确定调用了ConvertBack方法并创建了资源字典中的key吗?您的 xml 看起来是正确的。
  • 问题是资源是在合并的 xaml 资源字典中定义的,而不是直接在 App.xaml 中定义的,所以我通过使值转换器继承框架元素并使用查找资源方法来解决此问题。不确定这是多么“正确”,但多值转换器看起来像是另一种选择。

标签: c# .net wpf xaml idataerrorinfo


【解决方案1】:

在我看来,如果您的资源键是在 App.xaml 中定义的,那么它应该可以工作。但是您的资源密钥可能在某些用户控件中的资源中。 (string)App.Current.Resources[messageCode]; 仅在 App.xaml 资源中搜索。 您可以使用多值转换器的解决方案

class MessageCodeToMessageConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter,     System.Globalization.CultureInfo culture)
{
    FrameworkElement targetObject = values[0] as FrameworkElement;
    if (targetObject == null)
    {
       return DependencyProperty.UnsetValue;
    }
    if (value != null)
    {
        string messageCode = (string)values[1];
        try
        {
            return targetObject.FindResource(messageCode);
        }
        catch (Exception)
        {
            return messageCode;
        }
    }
    else
    {
        return null;
    }
}

public object ConvertBack(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return "";
}
}

<Style x:Key="TextBox" TargetType="{x:Type TextBox}">
  <Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
  <Setter Property="ToolTip">
    <Setter.Value>
        <MultiBinding Converter="{StaticResource Converter}">
            <MultiBinding.Bindings>
                <Binding RelativeSource="{RelativeSource Self}" />
                <Binding RelativeSource="{x:Static RelativeSource.Self}" Path="(Validation.Errors)[0].ErrorContent" />
            </MultiBinding.Bindings>
        </MultiBinding>
    </Setter.Value>
  </Setter>
</Trigger>
</Style.Triggers>
</Style>

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多