在MVVM中表示数据子集时的模型或ViewModel?

时间:2015-05-25 12:33:18

标签: c# wpf mvvm

如果我有一个表示大量数据的复杂模型,并且我只希望显示该模型的缩减版本(例如Name,Description),那么MVVM中最好的方法是什么?

我能找到的大多数解决方案似乎都假设数据已经存在于内存中,并建议使用仅公开所需字段的新ViewModel。

然而,不是从数据库中选择所有数据,而是最好选择必要的内容。然后我创建一个新模型来保存这些数据吗?可以直接选择ViewModel,但感觉做错了。同样地,使用新模型来表示相同数据的不同版本也会有所不同。

接受这种方法的方法是什么?

作为一个简单的例子(我通常不会这么简单的类):

public class User {
    public int UserID {get;set;}
    public string FirstName
    public string LastName
    public int AccessLevelID
    public List<Groups> UserGroups
}

但我真的需要:

public class PreviewUser {
    int UserID
    string FirstName
}

4 个答案:

答案 0 :(得分:1)

您可以从模型中删除不需要的属性(以略微提高性能),也可以创建仅提供要显示的属性的视图模型。

以下是一个例子:

public class UserViewModel
{
    private readonly User _user;

    public UserViewModel(User user)
    {
        _user = user;
    }

    public int UserID
    {
        get { return _user.UserID; }
    }

    public string FirstName
    {
        get { return _user.FirstName; }
    }
}
...
var viewModels = userRepository.GetUsers().Select(user => new UserViewModel(user));

<强>更新:

如果性能对您非常重要,您可以使用继承。基类将是较小版本的数据,派生类将包含完整数据。当您只需要从DB获取某些字段并节省带宽时,可以使用基类。

public class BaseUser
{
    public int UserID { get; set; }
    public string FirstName { get; set; }
}

public class User : BaseUser
{
    public string LastName { get; set; }
    public int AccessLevelID { get; set; }
    public List<Groups> UserGroups { get; set; }
}

答案 1 :(得分:1)

您可以使用业务类型的子集创建另一种类型。 通常这被称为

DTO - 数据传输对象,它仅封装您需要的内容。所以数据库只需要查询实体的子集。

 public class UserDto
 {
      public int ID { get;set;}
      public string Name{ get;set;}
 }

其次,如果你需要在显示器上添加一些ui逻辑,通常将特定的DTO包装在更具体的UI模型中。

public class UserUI 
{
     UserDTO _userDto;

     UserUI(UserDTO userDto)
     {
         _userDto = userDto;
     }

     public string Name
     {
        get{return IsAfter_21_hours ? "The user as gone home" : _userDto.Name;}
     }
}

UserViewModel将引用UserUI的实例。

答案 2 :(得分:0)

您可以使用多种方法:

  • 使用&#34;完整版&#34;源模型。由于您正在构建用户界面,因此用户只会看到您要显示的内容;
  • 使用视图模型,并将源模型包装到此视图模型中。实现很简单,在UI之前数据量有限;
  • 使用视图模型,并将源模型中的数据复制到此视图模型中。实现更复杂(从现有模型映射,或仅从数据库加载所需数据),但视图模型和模型完全解耦。

实际上,这取决于哪种更适合你。

注意,通常是&#34;查看模型&#34;和&#34;模型&#34;很模糊。如果模型如下所示:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

...并查看模型 - 像这样:

public class PersonViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后扔掉这个视图模型。虽然没有区别,但您不需要创建额外的课程。

答案 3 :(得分:-1)

我认为您不必创建新的模型类来保存用户数据以进行查看。而是创建视图模型类并将模型属性映射到VM。请参阅下面的示例

public class UserViewModel
{
    Public UserViewModel(User user)
    {
       //initialize required viewmodel properties here
    }
    int UserID {get;set;}
    string FirstName{get;set;}
}