Wpf MVVM:如何从模型对象创建ViewModel

Wpf MVVM:如何从模型对象创建ViewModel,wpf,mvvm,Wpf,Mvvm,我想获取模型的值并创建一个viewmode 在我的模型中,我有 public class TestElement { public TestElement CurrentNode { get; set; } public TestElement Parent { get; set; } } 我有一些方法可以做到这一点 if (thisNode == null) { thisNode = ne

我想获取模型的值并创建一个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父对象并获取我的模型父对象值

     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
                };
      }

         }
public IEnumerable ToTreeViewModel(IEnumerable treemodel)
{
foreach(树模型中的TestElementitem)
收益-收益-新TesterEntViewModel
{
Id=项目Id,
名称=项。名称,
Children=ToTreeViewModel(item.Children).ToList(),
父项=项。父项
};
}
}

我怎样才能做到这一点呢?

我猜你的施法失误发生在生产线上

Parent = item.Parent
TestElementViewModel中的父属性不是TestElement类型,因此您不能这样做

请尝试分配一个新的TestElementViewModel

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

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

比如说,

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
}

使您不必在每次实例化新的viewmodel时手动分配属性。

我猜您的强制转换错误发生在

Parent = item.Parent
TestElementViewModel中的父属性不是TestElement类型,因此您不能这样做

请尝试分配一个新的TestElementViewModel

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

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

比如说,

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
}

使您无需在每次实例化新的viewmodel时手动分配属性。

视图模型将引用您的模型。在我的ToTreeViewModel方法中,当我试图从列表中获取它时,我得到了一个强制转换错误..我用这个方法更新了我的原始帖子显示了ToTreeViewModel方法Public IEnumerable ToTreeViewModel(IEnumerable treemodel){foreach(treemodel中的TestElementitem)yield return new TestElementViewModel{Id=item.Id,Name=item.Name,Children=ToTreeViewModel(item.Children.ToList(),Parent=item.Parent};}}您的TestElement类没有Children属性,或者您出于某种原因遗漏了该属性。请向我们显示该属性。您的视图模型将引用您的模型。在我的ToTreeViewModel方法中,当我试图从列表中获取它时,我得到了一个强制转换错误..我用这个方法更新了我的原始帖子显示了ToTreeViewModel方法Public IEnumerable ToTreeViewModel(IEnumerable treemodel){foreach(treemodel中的TestElementitem)yield return new TestElementViewModel{Id=item.Id,Name=item.Name,Children=ToTreeViewModel(item.Children.ToList(),Parent=item.Parent};}}您的TestElement类没有Children属性,或者您出于某种原因遗漏了该属性。请给我们看看那栋房子。谢谢。这很有帮助。谢谢。这很有帮助。