父ViewModel与子进行通信

时间:2016-11-01 18:16:50

标签: c# xaml silverlight mvvm

我有一个带有嵌套子视图的主视图。我有一个主VM来保存子VM的实例。 在某些时候,主VM需要与孩子互动。

在主VM中。我将子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>

在后面的子视图代码中。

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();

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

修改 image

2 个答案:

答案 0 :(得分:0)

在主视图中替换

DataContext="{Binding VmEChild}

DataContext="{Binding VmChild}

答案 1 :(得分:0)

您正在尝试“修复”不应发生的空值方案,或者应该保持不变。

删除孩子代码隐藏的两个片段,如果你真的需要一个ViewModel属性(对于UWP是这个吗?),请使用:

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

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