使用SQLite时实现MVVM设计模式的正确方法
本文关键字:方法 设计模式 MVVM SQLite 实现 使用 | 更新日期: 2023-09-27 18:26:17
假设我有一个属性为Name
的Person's
的SQLite数据库
Public Class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
现在我有一个列表框显示这些名称的视图
<ListBox ItemSource={Binding People}>
<ListBox.ItemTemplate>
<DataTemplate>
<Label Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我的Views DataContext是PeopleViewVM
Public Class PeopleViewVM
{
Public PeopleViewVM
{
//Do my SQLite stuff,
// Get IEnumerable Person's
// Create Observable Collection of People
}
private ObservableCollection<Person> _people;
public ObservableCollection<Person> People
{
get { return _people; }
set
{
_people = value;
RaisePropertyChanged();
}
}
}
现在我明白了,这只是一个简单的例子。但我不确定这是否是MVVM设计模式的正确实现。如果Person是我的模型,这意味着视图在绑定到属性name
时直接绑定到模型。如果我在代码后面更改了一个人的名字,这将不会反映在视图中。使用MVVM设计模式执行此示例的正确方法是什么?
根据您的需求,这可能是"正确的"实现我不会说这个问题有"正确的"answers"不正确的"。更像是:这对我的场景更好吗?
人们选择直接根据自己的需求和感受将模型与视图绑定。有时我喜欢简化我的模型,并将它们封装到"PersonViewModel"中,以便公开更多相关的属性,而不会污染Model
。
如果这不适合你,你可以下载ReSharper(负责"尝试"保持视图和视图模型的同步),或者你可以进一步封装你的模型,并创建一个"代理"对象,例如:
Public Class PersonViewModel
{
readonly Person _person;
Public PersonViewModel(Person person)
{
_person = person;
}
public string Name
{
get { return _person.Name; }
set
{
_person.Name = value;
RaisePropertyChanged();
}
}
这似乎毫无意义,但有助于在模型实体经常更改的情况下保持视图和模型更加分离。根据我的经验,ReSharper确实处理了大多数情况。