在caliburn micro中是否有另一个NotifyOfPropertyChange函数可用于静态属性或其他方式使用它以及如何使用?
private static string _data = "";
public static string _Data
{
get
{
return _data;
}
set
{
_data = value;
NotifyOfPropertyChange(() => _Data);
}
}
答案 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中,或者创建一个包装功能的静态助手。