我有一个静态类(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"
出于某种原因,它无法正常工作。我究竟做错了什么? 另外,如何在代码隐藏中设置此绑定?
答案 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#代码中的类。