如果我有一个表示大量数据的复杂模型,并且我只希望显示该模型的缩减版本(例如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
}
答案 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;和&#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;}
}