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

时间:2018-01-22 21:28:15

标签: c# forms xaml xamarin binding

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

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));
    }

在我的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>

我在XAML中的Models中指定了ContentPage文件夹:

xmlns:Models="clr-namespace:Rdb.Models;assembly=Rdb"

出于某种原因,它无法正常工作。我究竟做错了什么? 另外,如何在代码隐藏中设置此绑定?

1 个答案:

答案 0 :(得分:3)

为了支持数据绑定,您的类必须实现INotifyPropertyChanged接口。遗憾的是,静态类无法实现接口,因此您的解决方案将无法正常工作。

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

App.Current.Resources["Evp"] = new Evp();

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

{Binding Name, Source={StaticResource Evp}}

要确保该类是单身,将是public static只获得属性:

public static Evp Instance {get;} = new Evp();

然后你还会添加一个private构造函数,以确保其他人不能创建你的类的实例:

private Evp()
{
}

然后将资源设置为:

App.Current.Resources["Evp"] = Evp.Instance;

这样,只需使用Evp.Instance即可轻松使用C#代码中的类。