【问题标题】:Setting "ViewModel" properties from "Model" class从“模型”类设置“视图模型”属性
【发布时间】:2020-01-08 14:18:47
【问题描述】:

我目前正在使用 MVVM 方法在 Xamarin 中开展一个项目。我从 youtube 上的杂项教程和 Xamarin 官方文档中学习了基础知识。但是,到目前为止,我从未见过处理此特定问题的示例。

可能是我误解了应该如何使用 MVVM 模式的某些部分,但如果没有,我想听听其他人是否有其他解决方案。

我已经获得了 ViewModel(.cs) 和 View(.xaml) 之间的基本绑定。

假设“视图”是一个名为 Profile.xaml 的文件,我们有:

<Label Text="{Binding Name}" />

绑定到“ViewModel”,我们称之为 ProfileViewModel.cs,它具有以下属性,并且还实现了 INotifyPropertyChanged:

public string Name {get; set;}

当然还有将两者绑定在一起并设置 BindingContext 的“模型”类(假设它实现了 ContentView,应该称为 Profile.xaml.cs):

private ProfileViewModel ViewModel;

public Profile() {
  BindingContext = ViewModel = new ProfileViewModel();
}

这对“View”和“ViewModel”之间的绑定进行了排序。

但是,当我初始化要绑定到“ViewModel”(ProfileViewModel.cs)的“View”(Profile.xaml)时,它是通过初始化“Model”(Profile.xaml.cs)和我还没有找到一个示例来展示如何使用现有数据填充 ViewModel。

就像在这个问题的示例中一样,“名称”可能已经存在于某种数据库中。我们通过执行以下操作在此处初始化整个 Profile 事物:

<Profile Name="Napoleon" />

执行此操作的“模型”类 (Profile.xaml.cs) 还需要具备以下条件: public string Name {get; set;}

并在设置 BindingContext 时将该字符串传递给“ViewModel”:

BindingContext = new ProfileViewModel(){ 
  Name = this.Name 
}

但是,我遇到过这样的情况,即那种已经存在的数据可能会异步出现,或者在配置文件“模型”被初始化之后。这使我得到了以下解决方案。实现一个 set 属性,该属性引用“ViewModel”中的相应属性。

public string Name {
  get => ViewModel.Name;
  set => ViewModel.Name = value;
}

正如我所说,这对我有用,但我真的很感兴趣其他想法如何解决这个问题,或者我的 MVVM 模式是否严重错误。

【问题讨论】:

  • *.xaml.cs 不是模型,它是视图的一部分(称为 code-behind)。实际上,*.xaml 和 *.xaml.cs 被编译成一个类。
  • 好的,谢谢,对我在示例中使用的方法有什么想法吗?

标签: c# xaml xamarin mvvm


【解决方案1】:

您正在混淆 MVVM 的元素。

Profile.xamlProfile.xaml.cs 是部分类声明。它们一起工作并编译到同一个文件中。这是你的看法。作为一般规则,您的 xaml.cs 文件中不应有任何逻辑,但此规则也有例外。

ProfileViewModel.cs 是您的视图模型。它处理所有业务逻辑并提供视图绑定到的属性。

Client.cs 将是模型的一个示例。通常模型中只存在公共属性,不存在业务逻辑。示例如下:

public class Client
{
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime BirthDate { get; set; }
}

根据您的情况,您将使用您的视图模型来执行网络调用并填充您的模型。然后您将您的 ViewModel.Name 属性设置为 Model.Name 并调用 OnPropertyChanged(nameof(Name)) 或调用任何您的 INotifyPropertyChanged 方法。这将告诉视图Name 已更改并更新其表示。

【讨论】:

  • 感谢您为我解决这个问题。似乎有道理。但是,如果我在初始化时从外部设置属性,客户端或视图,我作为示例给出的公共属性的直通类型是一个好主意吗?只是在我正在使用的应用程序中,如果要从每个视图模型中完成,它很快就会变成很多网络调用。
  • 所以您在更新视图模型中的属性的同时更新模型?如果是这样,那么这是一个很好的用例。如果您想将模型发送回服务器以更新信息,它可以保证模型是最新的。
猜你喜欢
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
相关资源
最近更新 更多