ObjectClass C# 中是否有 MVVM ObservableProperty 的方法?
我有一个 ObjectClass 和里面的一些属性
public class FontsVip
{
private static FontsVip obj;
public static FontsVip Obj
{
get { if (obj == null) obj = new FontsVip(); return obj; }
set => obj = value;
}
public string yellow;
}
我有一个 MAUI xaml 页面,其中包含将颜色属性绑定到模型的控件。
<Label Text="{Binding Eye}" VerticalOptions="Center"
FontFamily="FontsVip"
FontSize="21"
TextColor="{Binding Eyecolor}">
我的MVVM模型如下:
public partial class Model: ObservableObject
{
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(Eyecolor))]
private FontsVip fsv = FontsVip.Obj;
[ObservableProperty]
private string Eyecolor;
[RelayCommand]
public void changeColor()
{
AppTheme currenttheme = (AppTheme)Application.Current.RequestedTheme;
if (currenttheme is AppTheme.Dark)
{
Fsv.yellow = "#ff00ff";
//Eyecolor = Fsv.yellow;
}
}
...
}
我的问题是,在模型上,无法根据 FontsVip 类的更改属性观察更改并将其更新到 XAML 视图。
如果我取消评论
//Eyecolor = Fsv.yellow
它工作完美。但这实际上并不是基于 Observable 的。
要解决这个问题,您可以修改FontsVip类来实现INotifyPropertyChanged。通过实现此接口,您可以在属性更改时自动更新视图,这样您就可以在属性更改时引发事件。
public class FontsVip : INotifyPropertyChanged
{
private static FontsVip obj;
public static FontsVip Obj
{
get { if (obj == null) obj = new FontsVip(); return obj; }
set => obj = value;
}
private string yellow;
public string Yellow
{
get => yellow;
set
{
if (yellow != value)
{
yellow = value;
OnPropertyChanged(nameof(Yellow));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
FontsVip.Yellow 中的更改必须由您的 ViewModel 检测到,并且它必须相应地更新 Eyecolor。鉴于 FontsVip 是一个 singleton,您可以在初始化函数或 ViewModel 的构造函数中配置此逻辑: :
public partial class Model : ObservableObject
{
public Model()
{
FontsVip.Obj.PropertyChanged += FontsVip_PropertyChanged;
}
private void FontsVip_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(FontsVip.Yellow))
{
Eyecolor = FontsVip.Obj.Yellow;
}
}
[ObservableProperty]
private string eyecolor;
[RelayCommand]
public void ChangeColor()
{
AppTheme currentTheme = (AppTheme)Application.Current.RequestedTheme;
if (currentTheme == AppTheme.Dark)
{
FontsVip.Obj.Yellow = "#ff00ff";
}
}
protected override void OnDisposing()
{
FontsVip.Obj.PropertyChanged -= FontsVip_PropertyChanged;
base.OnDisposing();
}
}