如何在ViewModel中使用模型

时间:2018-08-08 15:02:10

标签: c# mvvm xamarin.forms

在Xamarin项目中使用MVVM时遇到问题。

如果更新了我的viewModel中的一个对象(例如,在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页面的Entry中。

当我修改Entry时,该值会升高,但是如果MyModel对象更改值(例如,更新(单击按钮)),则不会更新其他Entry的值

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

对不起,我的英语不好

1 个答案:

答案 0 :(得分:1)

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

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