Как получить доступ к представлению внутри DataTemplate из кода позади - PullRequest
1 голос
/ 27 марта 2012

Я привязываю свою viewmodel и просмотр с использованием словаря ресурсов следующим образом

<DataTemplate DataType="{x:Type viewmodels:MyViewModel}">
    <Views:MyView />
</DataTemplate>

в MyView, у меня есть dataGrid x: Name = "BoxDataGrid" с DataGrid.RowDetailsTemplate с другим dataGrid x: Name = "SpoolsDataGrid"

как получить доступ к MyView или к вышеупомянутым сетям данных, используя код в MyViewModel?

Причина в том, что я хочу загружать и показывать содержимое внутри RowDetailsTemplate только тогда, когда основная строка таблицы данных выбрана (нажата) через событие "RowDetailsVisibilityChanged".

Спасибо.

Исправление: Виноват. Я хочу получить доступ к MyView, а не к MyViewModel

Ответы [ 3 ]

0 голосов
/ 27 марта 2012

Асктомский ответ правильный. Вы можете получить доступ к ViewModel через свойство DataContext.

Однако, приложив немного больше усилий, вы почти всегда можете обойти прямой доступ к ViewModel из представления. Весь смысл MVVM или MVC в том, что между View и ViewModel нет зависимостей.

Вещи, которые вы должны исследовать в WPF для MVVM, включают:

  • Прикрепленные свойства
  • Прикрепленное поведение
  • медиаторы
  • Преобразователи значений
  • Расширения разметки

Вам необходимо знать обо всем этом, чтобы найти элегантные решения некоторых проблем, с которыми вы сталкиваетесь в MVVM.

Вам нужно будет указать немного больше информации о поведении, которое вы пытаетесь получить, если вы хотите, чтобы мы помогли вам выяснить, как вы можете это сделать, не обращаясь к ViewModel через datacontext.

Например, вы можете привязать видимость чего-либо к логическому значению во ViewModel с помощью конвертера?

Прошу прощения, если вы уже знаете все вышеперечисленное.

0 голосов
/ 28 марта 2012

Только что решил эту проблему, используя MVVM Light Toolkit - EventToCommand.Другие лучшие предложения очень приветствуются.

http://blog.galasoft.ch/archive/2009/11/05/mvvm-light-toolkit-v3-alpha-2-eventtocommand-behavior.aspx

Надеюсь, что это решение будет полезно для других.не нужно знать представление, в моем представлении таблицы данных

  <i:Interaction.Triggers>
      <i:EventTrigger EventName="RowDetailsVisibilityChanged">
         <cmd:EventToCommand Command="{Binding RowDetailsVisibilityChangedCommand}" PassEventArgsToCommand="True" />
      </i:EventTrigger>
  </i:Interaction.Triggers>

и в viewmodel

    public RelayCommand<DataGridRowDetailsEventArgs> RowDetailsVisibilityChangedCommand
    {
        get;
        private set;
    }

и в конструкторе viewmodel

 RowDetailsVisibilityChangedCommand = new RelayCommand<DataGridRowDetailsEventArgs>(e =>
{
   DataGrid SpoolsDataGrid = e.DetailsElement as DataGrid;
   DataRowView drv = (DataRowView)e.Row.Item;
   serialNo = drv.Row["BOX_SERIAL"].ToString();
   SpoolsDataGrid.ItemsSource = as400Service.GetSPOOL_BY_SERIAL_NO(serialNo);
 });
0 голосов
/ 27 марта 2012

Это довольно просто. Свойство DataContext в вашем MyView объекте указывает на конкретный объект MyViewModel. Таким образом, вы можете использовать привязки XAML к этой модели представления или обращаться к коду, например,

MyViewModel model = (MyViewModel) DataContext;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...