【发布时间】:2013-10-15 17:09:39
【问题描述】:
我的程序结构如下:
主窗口:
窗口->视图模型
UserControl1(绑定到contentPresenter)->ViewModel->Model
^TreeView(在 UC1 中)->ViewModel->Model
子窗口:
窗口->视图模型
UserControl2(绑定到contentPresenter)->ViewModel->Model
*子窗口是从UC1->ViewModel创建并打开的。
我需要在粗斜体视图模型之间创建关系。具体来说这是子窗口的User Control中的ViewModel,主窗口的User Control中TreeView的ViewModel。
这是必要的,因为我想从子窗口向TreeView 添加节点。问题是,虽然我在 UC2->VM 中为 TreeView(UC1)->VM 设置了一个属性,但我收到了一个 NullReferenceException,因为 UC2->VM 无法将属性设置为新的电视->虚拟机。
代码:
UserControl2->ViewModel
public ViewModel _TreeVM;
private Command _newNode;
public UserControl2_VM()
{
_newNode = new Command(NewNode_Operations);
}
public ViewModel TreeVM
{
get { return _TreeVM; }
set
{
_TreeVM = value;
NotifyPropertyChange(() => TreeVM);
}
}
//Command -- Adds new node
public Command NewNode { get { return _newNode; } }
private void NewNode_Operations()
{
TreeVM.addNewNode(); //**NullReferenceException
}
DataTemplate 在子窗口中:
<DataTemplate DataType="{x:Type project:UserControl2_VM}">
<UC:ChildWindowUC/>
</DataTemplate>
如何才能让我可以从子窗口的用户控件中的 ViewModel 访问 TreeView 的 viewModel?
【问题讨论】:
-
将 Parent 传递给子 ViewModel?
-
如果您说传递给子窗口的 ViewModel(不是 UserControl2->VM),我对如何做到这一点感到困惑,因为 CW 的 ViewModel 是使用
DataTemplate创建的(而不是使用DataContext)。 -
然后,无论该 DataTemplate (TreeView) 的 ItemsSource 是什么,您都应该在创建它时传入父级。我怀疑 DataTemplate 是否正在创建 ViewModel。
-
我把
DataTemplate放在你的问题中。它没有我知道的ItemsSource。我也认为它正在创建 ViewModel,因为我没有在任何地方用 c# 创建它。 -
这只是视图,视图模型在哪里以及它是如何填充的?什么是数据模板?什么数据模板?