【发布时间】: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 被编译成一个类。
-
好的,谢谢,对我在示例中使用的方法有什么想法吗?