【问题标题】:Establishing a relationship between ViewModels in different windows在不同窗口中建立 ViewModel 之间的关系
【发布时间】: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# 创建它。
  • 这只是视图,视图模型在哪里以及它是如何填充的?什么是数据模板?什么数据模板?

标签: c# wpf mvvm treeview


【解决方案1】:

将 ParentViewModel 传递给 ChildViewModel,以便您可以引用它。

DataContext = childWindowViewModel(ParentViewModel);

【讨论】:

  • 那么我是通过 UC1->ViewModel 还是 TreeView->ViewModel?
  • 另外,我的子窗口看不到任何父项。
  • 把UC1的ViewModel传给ChildWindowViewModel看不到父项?为什么不?这没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 2017-07-09
相关资源
最近更新 更多