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

时间:2018-04-20 13:51:51

标签: c# wpf mvvm caliburn.micro

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

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

2 个答案:

答案 0 :(得分:0)

您可以创建自己的方法来引发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));
}

有关详细信息,请参阅以下博客文章:http://10rem.net/blog/2011/11/29/wpf-45-binding-and-change-notification-for-static-properties

答案 1 :(得分:0)

  

为什么我不能在静态属性中使用NotifyOfPropertyChange?

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

  

在caliburn micro [...]中是否有另一个NotifyOfPropertyChange函数?

不,据我所知,事实并非如此。但是,你可以推出自己的实现,例如

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);

在您的属性设置器中。

关于签名的编辑:

而不是

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

你也可以使用

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

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

NotifyPropertyChange();

因为编译器会自动inject属性名称。

我刚刚去了Expression<Func<T>>,因为这个电话(几乎)与调用微型电话NotifyPropertyChange完全相同。

你需要知道的是,由于NotifyPropertyChange方法是静态的而不是实例方法,你不能将它重构为基类(例如{{ 1}})就像你可以用一个实例方法做的那样 - 这也是caliburn micro所做的。

因此你需要复制&amp;将事件和MyViewModelBase方法粘贴到每个具有静态属性的ViewModel中,或者创建一个包装功能的静态助手。