如何在静态 属性 中使用 NotifyOfPropertyChange (Caliburn Micro)

How to use NotifyOfPropertyChange in static property (Caliburn Micro)

  1. 为什么我不能在静态 属性 中使用 NotifyOfPropertyChange?
  2. caliburn micro 中是否有另一个 NotifyOfPropertyChange 函数可用于静态 属性 或其他使用方法?

    private static string _data = "";
    
    public static string _Data
    {
        get
        {
            return _data;
        }
        set
        {
            _data = value;
            NotifyOfPropertyChange(() => _Data);          
        }
    }
    

您可以创建自己的引发 StaticPropertyChanged 事件的方法:

private static string _data = "";
public static string _Data
{
    get
    {
        return _data;
    }
    set
    {
        _data = value;
        NotifyStaticPropertyChanged(nameof(_Data));
    }
}



public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
private static void NotifyStaticPropertyChanged(string propertyName)
{
    if (StaticPropertyChanged != null)
        StaticPropertyChanged(null, new PropertyChangedEventArgs(propertyName));
}

更多信息请参考以下博客post:http://10rem.net/blog/2011/11/29/wpf-45-binding-and-change-notification-for-static-properties

Why I can't use NotifyOfPropertyChange in a static property?

嗯,你不能像现在这样使用它,因为 NotifyOfPropertyChange 是一个 实例 方法,而不是静态方法。

Is there another NotifyOfPropertyChange function in caliburn micro [...]?

不,据我所知,不是。但是,您可以推出自己的实现,例如

public static event PropertyChangedEventHandler PropertyChanged;

private static void NotifyPropertyChange<T>(Expression<Func<T>> property)
{
    string propertyName = (((MemberExpression) property.Body).Member as PropertyInfo).Name;
    PropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
}

然后可以这样调用

NotifyOfPropertyChange(() => _Data);

在你的 属性 setter.


关于签名的编辑:

而不是

private static void NotifyPropertyChange<T>(Expression<Func<T>> property) { ... }

你也可以使用

private static void NotifyPropertyChange([CallerMemberName] string property) { ... }

它的优点是你不必显式传递任何东西,你可以像这样调用它

NotifyPropertyChange();

因为编译器会自动inject这个属性名字。

我只是选择了 Expression<Func<T>>,因为这个调用(几乎)与对 Caliburn Micro 的 NotifyPropertyChange.

的调用完全相同

您需要知道的是,由于 NotifyPropertyChange 方法是静态方法而不是实例方法,您 不能 将其重构为基础 class(例如 MyViewModelBase),就像您可以使用实例方法一样 - 这也是 Caliburn Micro 所做的。

因此,您需要在每个具有静态属性的 ViewModel 中复制并粘贴事件和 NotifyPropertyChange<T> 方法,或者创建一个静态助手来包装功能。