如何在视图中使用模型模型



我在将 MVVM 用于 Xamarin 项目时遇到问题。

如果我的视图模型中的一个对象被更新(例如,在 PUT 请求之后(,我无法刷新用户界面。

让我解释一下:

我的模型 :

public class MyObject
{
    public string Id { get; private set; }
    public string Name { get; private set; }
}

我的视图模型 :

public class MyViewModel : BaseViewModel
{
    public MyObject MyObject { get; private set; }
    public string IdMvvm
    {
        set
        {
            if (this.MyObject.Id != value)
            {
                MyObject.Id = value;
                OnPropertyChanged(nameof(IdMvvm));
            }
        }
        get { return MyObject.Id; }
    }
    public string NameMvvm
    {
        set
        {
            if (this.MyObject.Name != value)
            {
                MyObject.Name = value;
                OnPropertyChanged(nameof(NameMvvm));
            }
        }
        get { return MyObject.Name; }
    }
}

BaseViewModel 实现 INotifyPropertyChanged

public class BaseViewModel : INotifyPropertyChanged
{
    public string PageTitle { get; protected set; }
    LayoutViewModel() {}
    // MVVM ----------------------------------------------------------------------------------------
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    protected void SetValue<T>(ref T backingField, T value, [CallerMemberName] string propertyName = null)
    {
        if (EqualityComparer<T>.Default.Equals(backingField, value))
            return;
        backingField = value;
        OnPropertyChanged(propertyName);
    }

MyViewModel 被定义为我的页面的 BindingContext 我的属性 IdMvvm 和 NameMvvm 在 xaml 中绑定在我的页面的条目中

当我修改条目时,该值会提高,但是如果我的 MyModel 对象更改了值,例如更新(单击按钮(,则不同条目的值不会更新

你能帮我吗?因为我似乎错过了一些东西... 如果您需要更多解释,请告诉我

对不起,如果我的英语不好

这是因为当您更改模型时,您的视图不知道更改。更新代码,以便在模型更改时显式通知属性更改。

public class MyViewModel : BaseViewModel
{
    private MyObject _myObject;
    public MyObject MyObject 
    { 
       get { return _myObject; }
       private set { _myObject = value; NotifyModelChange(); }
    }
    public string IdMvvm
    {
        set
        {
            if (this.MyObject.Id != value)
            {
                MyObject.Id = value;
                OnPropertyChanged(nameof(IdMvvm));
            }
        }
        get { return MyObject.Id; }
    }
    public string NameMvvm
    {
        set
        {
            if (this.MyObject.Name != value)
            {
                MyObject.Name = value;
                OnPropertyChanged(nameof(NameMvvm));
            }
        }
        get { return MyObject.Name; }
    }
    private void NotifyModelChange()
    {
         OnPropertyChanged(nameof(IdMvvm));
         OnPropertyChanged(nameof(NameMvvm));
    }
}

最新更新