WPF:是否有一种方法可以在不定义资源的情况下使用ValueConverter?

3
有没有一种方法可以在不定义资源的情况下使用ValueConverter?目前的语法相当啰嗦。

如何使用反射来扫描您的程序集和注册值转换器? - undefined
使用转换器而不定义资源的语法更冗长。 - undefined
也许我可以创建一个 Binder 的子类,它接受一个字符串并进行反射查找。 - undefined
4个回答

7

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

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

同时,在XAML中

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

请注意,这些转换器不应存储任何状态,因为将使用相同的实例。 如果您对公共字段感到不安,只需创建一个静态属性即可。
尽管这是有争议的,但这可能更好。

+1 教我一种新技术,但我认为最关心的是让绑定声明更简短。我正在认真考虑完全放弃转换器,重新切换回 PyBinding。 - undefined

7
您可以使用MarkupExtension来最小化所需的XAML代码量。例如:
public class  MyConverter: MarkupExtension, IValueConverter

私有静态变量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}}

这种方法的优点在于确保所有转换器都是单例模式。
这篇文章很好地解释了这个概念,并提供了示例代码。

+1 你比我快了10秒 :) 这里有另一个链接... http://drwpf.com/blog/2009/03/17/tips-and-tricks-making-value-converters-more-accessible-in-markup/ - undefined

0
你是如何声明这些转换器的?导致冗长成为问题了吗?
<conv:NegatingConverter x:Key="NegatingConverter" />

每个应用程序每行一个转换器。
使用也不冗长。
Converter="{StaticResource NegatingConverter}"

理想情况下,我们只需要编写Converter="NegatingConverter",其他的都是为了让编译器正常工作而需要的噪音。 - undefined

0
你可以创建一个附加属性来连接到绑定并执行转换,但是如果唯一的原因是为了简洁性,我不建议在代码中添加额外的复杂性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接