添加到MVVM中的集合

时间:2010-09-12 23:40:00

标签: c# wpf mvvm

我有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的目的。

谢谢!

2 个答案:

答案 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的字典。