MVVM:如何从Model对象创建ViewModel

时间:2013-06-12 23:07:27

标签: wpf mvvm

我想获取模型的值并创建一个viewmode

在我的模型中我有

   public class TestElement
    {
     public TestElement CurrentNode { get; set; }
    public TestElement Parent { get; set; }
    }

我有一些方法可以做到这一点

    if (thisNode == null)
            {
                thisNode = new TestElement { Name = name, Parent = CurrentNode };
                currentCollection.Add(thisNode);
            }

在我的视图模型中,我想创建TestElementViewModel Parent并获取我的模型Parent值

     public class TestElementViewModel
    {

    public TestElementViewModel Parent { get; set; }

我想在这个方法中使用它

      public IEnumerable<TestElementViewModel> ToTreeViewModel(IEnumerable<TestElement> treemodel)
    {
        foreach (TestElementitem in treemodel)
            yield return new  TestElementViewModel
                {
                    Id = item.Id, 
                    Name = item.Name, 
                    Children = ToTreeViewModel(item.Children).ToList(), 
                  Parent = item.Parent
                };
      }

         }

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

我猜测你的投射错误发生在该行

Parent = item.Parent

你的TestElementViewModel中的Parent属性不是TestElement类型,所以你不能这样做。

尝试改为分配新的TestElementViewModel。

Parent = new TestElementViewModel { Id = item.Parent.Id, Name = item.Parent.Name, ... }

您可能需要考虑的一个改进是在ViewModel类中使用包装器,这将使分配属性更容易。

例如,

public class TestElementViewModel : INotifyPropertyChanged
{
    public TestElementViewModel(TestElement model)
    {
        Model = model;
        if(Model.Parent != null)
            Parent = new TestElementViewModel(Model.Parent);
    }

    public TestElement Model { get; private set; }

    private TestElementViewModel _parent;

    public TestElementViewModel Parent 
    { get { return _parent; }
      set { _parent = value; OnPropertyChanged("Parent"); }
    }

    public int Id
    {
        get { return Model.Id; }
        set { Model.Id = value; OnPropertyChanged("Id"); }
    }

    // rest of the properties need wrapping too
}

使得您无需在每次实例化新的视图模型时手动分配属性。