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

时间:2014-10-13 09:38:02

标签: c# sqlite design-patterns mvvm

因此,假设我有一个Person's的SQLite数据库,其属性为Name

Public Class Person
{

    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
}

现在我有一个带有ListBox的视图显示这些名称

<ListBox ItemSource={Binding People}>
    <ListBox.ItemTemplate>
        <DataTemplate>
           <Label Text="{Binding Name}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

和我的观点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设计模式执行此示例的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

这可以是&#34;正确&#34;根据您的要求实施。我不会说有一个&#34;正确&#34;和&#34;不正确&#34;对于这个问题。更像是:对我的情况会更好吗?

人们选择根据他们的要求以及他们的感受直接将模型与视图绑定。有时我喜欢简化我的模型,并将它们包装到&#34; PersonViewModel&#34;中,以便公开更多相关属性,而不是污染Model

如果这不适合您,您可以下载ReSharper(注意&#34;尝试&#34;保持View&amp; viewmodel同步),或者您可以进一步封装模型,并创建a&#34;代理&#34;对象,如此:

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确实照顾了大多数情况。