我在静态类中找到了静态属性的通知属性更改示例。但它不会更新TextBlock中的任何更改。这是代码。
第一个绑定在构造函数中使用“test”字符串,但StaticPropertyChanged始终为null。
public static class InteractionData
{
public static List<string> SelectedDirectories { get; set; }
private static string errorMessage { get; set; }
public static string ErrorMessgae
{
get { return errorMessage; }
set
{
errorMessage = value;
NotifyStaticPropertyChanged("errorMessage");
}
}
static InteractionData()
{
SelectedDirectories = new List<string>();
errorMessage = "test";
}
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
private static void NotifyStaticPropertyChanged(string propertyName)
{
if (StaticPropertyChanged != null)
StaticPropertyChanged(null, new PropertyChangedEventArgs(propertyName));
}
}
在视图中......
xmlns:error ="clr-namespace:CopyBackup.Providers"
<TextBlock Text="{Binding Source={x:Static error:InteractionData.ErrorMessgae} ,Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
无论我在何处更改属性,TextBlock都不会更新。
欣赏
答案 0 :(得分:5)
与INotifyPropertyChanged的实现类似,static property change notification仅在您触发StaticPropertyChanged
事件时使用正确的属性名称时才有效。
使用属性名称,而不是支持字段的名称:
public static string ErrorMessgae
{
get { return errorMessage; }
set
{
errorMessage = value;
NotifyStaticPropertyChanged("ErrorMessgae"); // not "errorMessage"
}
}
您当然也应该修复拼写错误的属性名称:
public static string ErrorMessage
{
get { return errorMessage; }
set
{
errorMessage = value;
NotifyStaticPropertyChanged("ErrorMessage");
}
}
绑定应如下所示:
Text="{Binding Path=(error:InteractionData.ErrorMessage)}"
有关静态属性更改通知的详细信息,请参阅this blog post。
您也可以使用CallerMemberNameAttribute
:
using System.Runtime.CompilerServices;
...
public static event PropertyChangedEventHandler StaticPropertyChanged;
private static void NotifyStaticPropertyChanged(
[CallerMemberName] string propertyName = null)
{
StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
}
您现在可以在不明确指定属性名称的情况下调用该方法:
NotifyStaticPropertyChanged();