C# 如何在viewModel中使用模型

C# 如何在viewModel中使用模型,c#,mvvm,xamarin.forms,C#,Mvvm,Xamarin.forms,我在Xamarin项目中使用MVVM时遇到问题 如果更新了viewModel中的某个对象(例如,在PUT请求之后),则无法刷新用户界面 让我解释一下: 我的模型: public class MyObject { public string Id { get; private set; } public string Name { get; private set; } } 我的viewmodel: public class MyViewModel : BaseViewModel

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

如果更新了viewModel中的某个对象(例如,在PUT请求之后),则无法刷新用户界面

让我解释一下:

我的模型:

public class MyObject
{
    public string Id { get; private set; }
    public string Name { get; private set; }
}
我的viewmodel:

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);
    }
公共类BaseViewModel:INotifyPropertyChanged
{
公共字符串PageTitle{get;protected set;}
LayoutViewModel(){}
//MVVM----------------------------------------------------------------------------------------
公共事件属性更改事件处理程序属性更改;
受保护的OnPropertyChanged无效([CallerMemberName]字符串propertyName=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
受保护的void SetValue(ref T backingField,T value,[CallerMemberName]字符串propertyName=null)
{
if(EqualityComparer.Default.Equals(backingField,value))
返回;
backingField=值;
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));
    }
}

最好的方法:MyViewModel不包含模型。请使用AutoMapper将您要显示的属性从模型映射到ViewModel谢谢您的答复。我也会从这方面看。