如何在静态 属性 中使用 NotifyOfPropertyChange (Caliburn Micro)
How to use NotifyOfPropertyChange in static property (Caliburn Micro)
- 为什么我不能在静态 属性 中使用 NotifyOfPropertyChange?
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>
方法,或者创建一个静态助手来包装功能。
- 为什么我不能在静态 属性 中使用 NotifyOfPropertyChange?
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>
方法,或者创建一个静态助手来包装功能。