C# 使用SQLite时实现MVVM设计模式的正确方法

C# 使用SQLite时实现MVVM设计模式的正确方法,c#,sqlite,design-patterns,mvvm,C#,Sqlite,Design Patterns,Mvvm,假设我有一个SQLite数据库,其中包含个人的,属性为姓名 Public Class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } } 现在我有了一个视图,其中一个列表框显示了这些名称 <ListBox ItemSource={Binding People}>

假设我有一个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>
现在我明白这是一个简单的例子。但我不确定这是否是MVVM设计模式的正确实现。 如果是Person my model,这意味着视图在绑定到属性
name
时直接绑定到模型。如果我在代码隐藏中更改了一个人的名字,这将不会反映在视图中。使用MVVM设计模式执行此示例的正确方法是什么?

根据您的需求,这可能是“正确”的实现。我不会说这个问题有“正确”和“不正确”两种说法。更像是:这对我的场景是否更好

人们选择直接根据自己的需求和感受将模型与视图绑定。有时我喜欢简化我的模型,并将它们包装到“PersonViewModel”中,以便公开更多相关的属性,而不污染
模型

如果这不适合您,您可以下载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确实负责大多数情况

谢谢你提供的信息。显然,在本例中,创建
PersonViewModel
是毫无意义的。但我想知道,如果给出一个更复杂的示例,这是否是正确的实现。。这意味着您的视图没有直接绑定到模型?但这也意味着,当您将这些信息放回SQLite时,必须将
PersonViewModel的
列表转换回
Person的
@user1;没有像您所追求的那样的
正确实现
。可以有一个更适合您的情况的实现。你需要问问自己,你需要这个吗?你从中得到了什么?例如,如果需要,将视图和模型解耦是一种常见的技术;我使用它来简化模型,为视图添加额外的属性,等等。。关于转换部件:是的,这意味着您需要将其转换回。我们有汽车制造商。
Public Class PersonViewModel
{
     readonly Person _person;

     Public PersonViewModel(Person person)
     {
       _person = person;
     }

   public string Name
   {
       get { return _person.Name; }
       set 
       { 
           _person.Name = value;
           RaisePropertyChanged();
       }
   }