2016-12-09 2 views
0

У меня есть метод, который должен иметь доступ к объекту xaml.wpf Доступ к объекту xaml, созданному LoadComponent(), из ViewModel

Я знаю, что это нарушает соглашение 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> 

У меня есть ViewModel, который необходимо заполнить TreeView.

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) 
     } 
} 

есть мессенджер класс, который будет вызывать метод «OnPlanPopulated», когда selectedPlan является густонаселенным.

У меня возникли проблемы с этим.

А именно, я не могу получить доступ к объекту TestCasePage, созданному в Initialize().

Есть ли способ сделать это?

+0

Почтовый индекс, который пытается получить доступ к объекту 'TestCasePage'. – sthotakura

ответ

0

Если вы хотите иметь доступ к TreeView или странице в вашей модели просмотра, вам необходимо передать ссылку на нее. Вместо того чтобы посылать простую строку в качестве полезной нагрузки с помощью Посланнику можно определить тип, который может нести как строку и ссылку на TreeView/Страница:

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

Вы затем использовать этот тип в качестве типа аргумента методы отправки и регистрации мессенджера;

Вид:

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) 
} 
Смежные вопросы