我有2个ViewModel。一个叫做User(包含基本信息,没什么花哨的),另一个叫做Group,它有一个IEnumerable of User作为属性。这个IEnumerable是由字典支持的(有很多用户,需要快速搜索它们)
public class Group
{
#region Fields
private Dictionary<string, User> userLookup;
#endregion //Fields
public Group()
{
userLookup = new Dictionary<string, User>();
}
public User[] Users
{
get
{
return userLookup.Values.ToArray<User>();
}
set
{
foreach (var user in value)
{
if (!userLookup.ContainsKey(user.Login))
userLookup.Add(user.Login, user);
}
}
}
public bool AddUser(User user)
{
if (userLookup.ContainsKey(user.Login))
return false;
userLookup.Add(user.Login, user);
return true;
}
}
现在,GroupViewModel类需要添加一个新用户,但显示的所有GroupViewModel都是UserViewModels,而Add功能只接受User类型。目前我在UserViewModel上有一个内部函数,它暴露了底层的User对象,我只是想知道这是否打败了使用MVVM的目的。
谢谢!
答案 0 :(得分:1)
据我了解,在MVVM中,ViewModel的目的是为视图提供公共数据和接口。因此,如果视图需要对这些数据进行说明,那么不,我认为这不会破坏MVVM,我认为它与框架非常相似。虽然一些经验丰富的开发人员可能会有更多的洞察力。
同样在Users
属性中,您可以在setter中加倍使用AddUser代码。
set
{
foreach (var user in value)
AddUser(user);
}
如果输入用户的条件发生变化或变得更加复杂,可能会更容易并且无需更改设置器。
答案 1 :(得分:0)
我认为只要你通过方法做到这一点就可以了。
看,MVVM说的是“不要直接将域对象绑定到View,将它们包装在View Model中”。
除非您使用ObjectDataProvider,否则方法不会用于绑定。
另一种方法是,您可以让GroupViewModel保存UserViewModel的字典。