我在将 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));
}
}