WPF:在绑定时指定ValueConverter的另一种方法

时间:2009-06-03 20:41:34

标签: wpf binding valueconverter

我为绑定指定值转换器时遇到的最常见的方法是:
1.使用键创建值转换器的实例作为资源 2.使用StaticResource标记扩展名引用实例:

<TextBlock Text="{Binding Converter={StaticResource myFormatter}" />  

问:使用静态实例有什么问题,如下所示:

<TextBlock Text="{Binding Path=Description, Converter={x:Static local:MyFormatter.Instance}}"/>

// where Instance is declared as:
public readonly static MyFormatter Instance = new MyFormatter();

在我的情况下,值转换器是不可变的。

修改:另一种方式是to turn the converter into an extension 以便您使用标记扩展格式指定转换器:

<TextBlock Text="{Binding Converter={local:MyFormatter}}"/>

2 个答案:

答案 0 :(得分:2)

从技术上讲它会没问题,但实际上我不喜欢它:

  1. 如果您将转换器声明为资源,那么您只有一个参考点。如果您更改转换器的命名空间或类名,那么您只有一个地方可以更新。

  2. 如果将其声明为静态,则需要将clr-namespace置于使用转换器的每个xaml文件的顶部。如果您将其声明为资源,则不需要。

  3. {Binding Converter={StaticResource myFormatter}比静态的更短,更容易阅读。从长远来看,这将比你想象的更有帮助。

答案 1 :(得分:0)

只要格式化程序确实没有状态,这应该没问题。但它并不等同。在第一种情况下,您为基于XAML的控件的每个实例都有一个类的实例。在第二个中,只会创建一个实例。