一尘不染

通知绑定静态类中的静态属性

c#

我在 静态* 类中找到了一个针对 静态 属性的通知属性更改示例。但它不会更新TextBlock中的任何更改。这是代码。 *

第一次绑定正在使用构造函数中的“测试”字符串,但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都不会更新。

欣赏


阅读 391

收藏
2020-05-19

共1个答案

一尘不染

与INotifyPropertyChanged的实现类似,静态属性更改通知仅在触发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)}"

有关静态属性更改通知的详细信息,请参见此博客文章


您也可以避免使用以下代码来编写属性名称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();
2020-05-19