ObjectClass C# 中是否有一种方法 MVVM ObservableProperty?

问题描述 投票:0回答:1

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 的。

mvvm maui
1个回答
0
投票

要解决这个问题,您可以修改FontsVip类来实现INotifyPropertyChanged。通过实现此接口,您可以在属性更改时自动更新视图,这样您就可以在属性更改时引发事件。

  • 添加属性 Yellow 封装字段 yellow
  • OnPropertyChanged 方法用于引发 PropertyChanged 事件。
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();
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.