如何在静态属性中使用 NotifyOfPropertyChange (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));
}

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

为什么我不能在静态属性中使用 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();

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

我只是去了Expression<Func<T>>,因为电话(几乎)与对Caliburn Micro的NotifyPropertyChange的电话完全相同。


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

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

相关内容

  • 没有找到相关文章

最新更新