我有一个带有嵌套子视图的主视图。我有一个主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实例。在子视图的代码后面,我再次定义它。但我不知道如何解决它。
答案 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,它不应该创建一个。