WPF:有没有办法在不定义资源的情况下使用ValueConverter?

时间:2010-07-19 01:34:12

标签: wpf

有没有办法在不在资源中定义ValueConverter的情况下使用它?因为语法非常详细。

4 个答案:

答案 0 :(得分:6)

您可以使用MarkupExtension来最小化所需的xaml代码量。例如:

public class  MyConverter: MarkupExtension, IValueConverter

{     private static MyConverter _converter;

public object Convert(object  value, Type targetType, 
object  parameter, System.Globalization.CultureInfo culture)
{
    // convert and return something
}

public object  ConvertBack(object value, Type  targetType, 
object parameter,  System.Globalization.CultureInfo culture)
{
    // convert and return something (if needed)
}

public override object  ProvideValue(IServiceProvider serviceProvider)
{
    if (_converter == null)
        _converter = new MyConverter();
    return _converter;
}

}

你最终会得到这样的语法:

{Binding Converter={conv:MyConverter}}

这种方法的另一个优点是可以确保所有转换器都是单例。

这个article很好地解释了这个概念并提供了示例代码。

答案 1 :(得分:5)

在转换器中,您可以拥有一个可以在xaml中引用的静态属性或字段。无需添加资源。

 public class MyConverter : IValueConverter
{
    public static readonly MyConverter Instance = new MyConverter();
... }

在XAML中

<TextBlock Text="{Binding Path=., Converter={x:Static l:MyConverter.Instance}}" />

请注意,这些转换器不应存储任何状态,因为将使用相同的实例。 如果您对公共字段感到满意,只需创建一个静态属性。

虽然这是更好的辩论

答案 2 :(得分:0)

您可以创建一个attach属性来连接绑定并执行转换,但如果唯一的原因是严重性,我建议您不要在代码中添加额外的复杂性。

答案 3 :(得分:0)

你究竟如何声明这些转换器,以至于冗长是一个问题?

<conv:NegatingConverter x:Key="NegatingConverter" />

每个应用程序每个转换器一行。

用法也不详细。

Converter="{StaticResource NegatingConverter}"