2

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

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

Q:如下使用静态实例有什么问题吗:

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

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

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

编辑:另一种方法是将转换器转换为扩展 ,以便您使用标记扩展格式指定转换器:

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

2 回答 2

2

从技术上讲它会很好,但在实践中我不喜欢它:

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

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

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

于 2009-06-03T20:53:43.293 回答
0

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

于 2009-06-03T20:50:51.987 回答