什么更有效{X:Static Class.Default}或{StaticResource Class}?

时间:2011-03-26 09:12:49

标签: xaml

假设我有要在XAML中引用的类。

public class MyConverter
{
  public static readonly MyConverter Default = new MyConverter();
  ...
};

然后在XAML中我可以引用它

<Label Content="{Binding Text,Converter={x:Static local:MyConverter.Default}"/>

<local:MyConverter x:Key="MyConverter"/>
...
<Label Content="{Binding Text,Converter={StaticResource local:MyConverter}"/>

哪种方式更有效?

2 个答案:

答案 0 :(得分:2)

我怀疑这里的任何东西都会比其他东西更有效,但这里的关键区别在于实际发生的事情:

  1. 在第一种方法中,您引用了类MyConverter
  2. 的静态字段
  3. 在第二种情况下,您正在创建MyConverter实例并使用它。
  4. 我相信第一个人可能会更快地结合百分比(或者你的意思是效率是多少?)但是这种差异不会给你带来多少利润。如果你已经有一个静态字段,我会选择#1选项。此外,据我所记得,x:Static仍然无法在Silverlight中使用。

答案 1 :(得分:1)

我发现第一个选项很有趣,因为它提供了一个很好的方法,可以将类用于与单例结合使用的任务的不同变体。想象这样的可见性值转换器:

public class VisibilityConverter : IValueConverter
{
    private static readonly VisibilityConverter defaultInstance = new VisibilityConverter();

    public static VisibilityConverter Default = new VisibilityConverter();
    public static VisibilityConverter InverseBoolean = new VisibilityConverter() { Inverse = true };

        public bool Inverse { get; set; }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var isVisible = value != null
                && value.GetType() == typeof(bool)
                && (bool)value;

            if (Inverse)
            {
                isVisible = !isVisible;
            }

            return isVisible ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
        }

然后可以轻松地以默认和反向模式使用它:

Converter={x:Static converters:VisibilityConverter.Default}
Converter={x:Static converters:VisibilityConverter.InverseBoolean}