Parent ViewModel 通信 child

Parent ViewModel communicate child

我有一个带有嵌套 child 视图的主视图。我有一个主虚拟机,其中包含 child 个虚拟机的实例。 在某些时候,主 VM 需要与 child.

进行交互

在主虚拟机中。我将 child ViewModel 定义为

 public ChildViewModel VmChild
    {
        get
        {
            if (this.vmChild == null)
                this.vmChild = new ChildViewModel();
            return this.vmChild;
        }
        set
        {
            if (this.vmChild != value)
            {
                this.vmChild = value;
                this.OnPropertyChanged("VmChild");
            }
        }
    }

在主视图中。我有

<StackPanel Orientation="Vertical" HorizontalAlignment="Left" >
     <localViews:ChildView DataContext="{Binding VmChild}"> </localViews:ChildView>
</StackPanel>

在child查看后面的代码。

public ChildViewModel ViewModel
{
    get
    {
        if (this.vmChild == null)
            this.vmChild = new ChildViewModel();
        return this.vmChild;
    }
    set
    {
        if (this.vmChild != value)
        {
            this.vmChild = value;
        }
    }
}

private void InitializeViewModel()
{
    if (this.DataContext is ChildViewModel)
    {
        this.ViewModel = this.DataContext as ChildViewModel;
    }
    else
    {
        this.DataContext = this.ViewModel;
    }
}

我的问题是我的代码可以运行。但是当我打开主视图时它有一个异常。

例外是NullReferenceException was thrown on "ChildView": Cannot create an instance of "ChildView"。错误行位于 this.vmChild = new ChildViewModel();

我认为我定义了两次视图模型实例导致了它。在主视图模型中,我已经定义了 child vm 实例。在 child 视图后面的代码中,我再次定义了它。但是我不知道怎么解决。

编辑:

在主视图中替换

DataContext="{Binding VmEChild}

DataContext="{Binding VmChild}

您正试图 'fix' 一个不应发生或不应发生的空值场景。

删除子代码隐藏的两部分,如果您真的需要 ViewModel 属性(这是用于 UWP 吗?),请使用:

// not normally needed in WPF/MVVM
public ChildViewModel ViewModel { get { return DataContext as ChildViewModel; } }

子视图正在获取 一个 ViewModel,它不应该创建一个。