我为绑定指定值转换器时遇到的最常见的方法是:
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}}"/>
答案 0 :(得分:2)
从技术上讲它会没问题,但实际上我不喜欢它:
如果您将转换器声明为资源,那么您只有一个参考点。如果您更改转换器的命名空间或类名,那么您只有一个地方可以更新。
如果将其声明为静态,则需要将clr-namespace
置于使用转换器的每个xaml文件的顶部。如果您将其声明为资源,则不需要。
{Binding Converter={StaticResource myFormatter}
比静态的更短,更容易阅读。从长远来看,这将比你想象的更有帮助。
答案 1 :(得分:0)
只要格式化程序确实没有状态,这应该没问题。但它并不等同。在第一种情况下,您为基于XAML的控件的每个实例都有一个类的实例。在第二个中,只会创建一个实例。