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

Jon*_*len 2 wpf

有没有办法使用ValueConverter而不在资源中定义它?因为语法非常详细.

Dan*_*iel 6

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

public class  MyConverter: MarkupExtension, IValueConverter
Run Code Online (Sandbox Code Playgroud)

{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;
}
Run Code Online (Sandbox Code Playgroud)

}

你最终得到这样的语法:

{Binding Converter={conv:MyConverter}}
Run Code Online (Sandbox Code Playgroud)

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

这个文章很好地解释这一概念的一个伟大的工作,并提供示例代码.


aqw*_*ert 5

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

 public class MyConverter : IValueConverter
{
    public static readonly MyConverter Instance = new MyConverter();
... }
Run Code Online (Sandbox Code Playgroud)

在XAML中

<TextBlock Text="{Binding Path=., Converter={x:Static l:MyConverter.Instance}}" />
Run Code Online (Sandbox Code Playgroud)

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

虽然这是更好的辩论是值得商榷的