无法在 XAML (Xamarin Forms) 中绑定静态属性

Las*_*zlo 1 c# forms xaml binding xamarin

我有一个静态类(Evp),位于Models文件夹中。它有一个Name字符串,带有 getter 和 setter 以及 aPropertyChangedEventHandler及其代码:

public static event PropertyChangedEventHandler StaticPropertyChanged;
private static string _name
public static string Name{
    get => _name;
    set{
        _name = value;
        OnStaticPropertyChanged("Name"); } }
private static void OnStaticPropertyChanged(string propertyName)
    {
        StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
    }
Run Code Online (Sandbox Code Playgroud)

在我的 XAML 文件中,这就是我尝试绑定的方式(如果我没记错的话,它在 WPF 4.5 中有效):

<Label Grid.Row="0" Grid.Column="1" TextColor="Beige" Text="{Binding Source={x:Static Models:Evp.Name}}" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" FontSize="30"></Label>
Run Code Online (Sandbox Code Playgroud)

Models在 XAML 中指定了文件夹ContentPage

xmlns:Models="clr-namespace:Rdb.Models;assembly=Rdb"
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它不起作用。我究竟做错了什么?另外,如何在代码隐藏中设置此绑定?

Mar*_*und 5

为了支持数据绑定,您的类必须实现该INotifyPropertyChanged接口。不幸的是,静态类无法实现接口,因此您的解决方案将不起作用。

解决方案是创建一个实现的普通类INotifyPropertyChanged,然后创建该类的单例实例,您将其注册为资源:

App.Current.Resources["Evp"] = new Evp();
Run Code Online (Sandbox Code Playgroud)

然后用StaticResource标记扩展引用它:

{Binding Name, Source={StaticResource Evp}}
Run Code Online (Sandbox Code Playgroud)

为了确保该类是单例的,将使用public static仅获取属性:

public static Evp Instance {get;} = new Evp();
Run Code Online (Sandbox Code Playgroud)

然后您还可以添加一个private构造函数以确保其他人无法创建您的类的实例:

private Evp()
{
}
Run Code Online (Sandbox Code Playgroud)

然后资源将被设置为:

App.Current.Resources["Evp"] = Evp.Instance;
Run Code Online (Sandbox Code Playgroud)

这使得只需使用Evp.Instance.