使用值转换器生成GUI友好的字符串是否误用了值转换器?

时间:2010-04-06 22:01:25

标签: wpf xaml valueconverter

目前,我使用值转换器为GUI生成用户友好的字符串。例如,我有一个窗口,显示状态栏中可用实体的数量。 Viewmodel只有一个调用代码可以设置的int依赖属性,然后在显示实体数量的文本框的绑定上,我指定了int依赖属性和一个将“x”更改为“x实体可用的值转换器” ”。

我的代码开始变得乱七八糟,我的XAML中有大量烦人的资源声明,但我喜欢它们,因为所有特定于GUI的字符串格式化都在转换器和调用中被隔离代码不必担心它。但是,我仍然想知道这不是价值转换器的目的。

3 个答案:

答案 0 :(得分:2)

如果您正在使用valueconverter进行设计,那么这并非“错误”。我个人使用它们将枚举值转换为友好字符串,但不是硬编码字符串到值转换器,VC使用枚举值从资源文件中获取字符串。

在你提到的具体情况中,我会做一些不同的事情来减少你拥有的VC的数量 - 你可以只用一个。你正在做的是将值直接替换/插入已知字符串。您可以做的是开始使用可用的ConverterParameter,并使用它来传递资源文件中字符串的ID,然后可以将传入VC的值插入到字符串中由VC ConverterParameter指定。这是一个快速的伪代码示例:

public class MyConverter : IValueConverter
{
    public MyConverter()
    {
        _rm = new ResourceManager("[my_assembly_name].Resources.strings", Assembly.GetExecutingAssembly());
    }

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (parameter is string && !string.IsNullOrEmpty((string)parameter))
        {
            string z = _rm.GetString((string)parameter);
            if (z != null)
            {
                return string.Format(z, value);
            }
        }

        return value;
    }

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

    #endregion

    ResourceManager _rm;
}

你会像这样使用这个转换器:

<TextBlock Text={Binding someNumericValue, Converter={StaticResource MyConverter}, ConverterParameter=[key_to_resource_string]} />

另请参阅WPF4 - IIRC,它能够将格式字符串指定为绑定表达式的一部分,这对您也有帮助。

答案 1 :(得分:1)

我通常在视图模型中进行这种转换。因此视图模型将具有字符串依赖属性,该属性“修饰”基础int值。

从您的问题中不清楚如何在您的方案中更新int值,因此这可能是选择正确解决方案的一个因素。

使用视图模型更具表现力恕我直言 - 你直接绑定到正在显示的内容,你的显示逻辑(我会考虑它)不会埋没在你只能找到的转换器中透过XAML看。

答案 2 :(得分:1)

正如@slugster所提到的,StringFormat属性可以在Binding中指定,尽管从.NET 3.5sp1开始可用。这就是我通常指定这些类型的格式:

<TextBlock Text="{Binding x, StringFormat={}{0} entities available.}" />

这使您的ViewModel只能指定显示所需的数据,并且可以轻松地允许视图根据需要格式化数据。 IMO,这是视图和视图模型之间最清晰的分离线。

请注意,{}必须转义{},因为它是StringFormat属性之后的第一个元素。