wpf从ViewModel访问由LoadComponent()创建的xaml对象

时间:2016-12-09 23:59:06

标签: c# wpf xaml

我有一个需要访问xaml对象的方法。

我知道这打破了MVVM约定,但还有其他情况阻止我简单地使用数据绑定。

这是xaml代码

<Page x:Class="RainforestExcavator.cs1.UI.TestCasePage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:local="clr-namespace:RainforestExcavator.cs1.UI"
  mc:Ignorable="d" 
  d:DesignHeight="300" d:DesignWidth="300"
  Title="TestCasePage">

<Grid>
    <TreeView x:Name="treeView"/>
</Grid>

我有一个需要填充treeView的ViewModel。

    public class TestSuiteViewModel :  INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;
        public TestSuiteViewModel()
        {
            LoadData();
            LoadCommand();
            Messenger.Messenger.Default.Register<string>(this, OnPlanPopulated,"PlanUpdated");
        }

        private void OnPlanPopulated(string selectedPlan)
        {  
        methodThatWillPopulateTheTreeView(selectedPlan, treeView)
        }
}

有一个信使类会触发&#34; OnPlanPopulated&#34;填充selectedPlan时的方法。

我在这方面遇到了麻烦。

即,我无法访问在Initialize()上创建的TestCasePage对象。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:0)

如果您希望能够在视图模型中访问TreeView或Page,则需要传入对它的引用。使用Messenger发送一个简单的字符串作为有效负载,您可以定义一个类型,它可以携带字符串和对TreeView / Page的引用:

public class ThePayLoad
{
  public string SelectedPlan {get; set;}
  public TreeView TreeView { get; set; }
}

然后使用此类型作为messenger的Send和Register方法的类型参数;

查看:

 Messenger.Messenger.Default.Send<ThePayLoad>( new ThePayLoad() { SelectedPlan = "selected plan...", TreeView = treeView} );

查看型号:

public TestSuiteViewModel()
{
        LoadData();
        LoadCommand();
        Messenger.Messenger.Default.Register<ThePayLoad>(this, OnPlanPopulated,"PlanUpdated");
}

private void OnPlanPopulated(ThePayLoad payload)
{  
    methodThatWillPopulateTheTreeView(payLoad.SelectedPlan, payLoad.treeView)
}