如何从Code后面访问DataTemplate中的View

时间:2012-03-27 04:39:28

标签: c# wpf

我正在使用资源字典绑定我的viewmodel和view,如下所示

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

在MyView中,我有dataGrid x:Name =“BoxDataGrid”,DataGrid.RowDetailsTemplate有其他dataGrid x:Name =“SpoolsDataGrid”

如何使用MyViewModel中的代码访问 MyView 或数据网格?

原因是,我只想在通过事件“RowDetailsVisibilityChanged”选择(点击)主数据网格行时加载并显示RowDetailsTemplate内的内容。

感谢。

校正:  我的错。我想访问MyView而不是MyViewModel

3 个答案:

答案 0 :(得分:0)

这很容易。 DataContext对象中的MyView属性指向MyViewModel的具体对象。因此,您可以将XAML绑定用于此视图模型或在代码隐藏中访问,例如

MyViewModel model = (MyViewModel) DataContext;

答案 1 :(得分:0)

asktomsk的回答是正确的。您可以通过DataContext属性访问ViewModel。

然而,通过一点点努力,您几乎总能绕过从视图中直接访问ViewModel。 MVVM或MVC的重点在于View与ViewModel没有依赖关系。

你应该在WPF中研究MVVM的事情包括:

  • 附加属性
  • 附加行为
  • 介体
  • 价值转换器
  • 标记扩展程序

您需要了解所有这些,以便找到与MVVM遇到的一些问题的优雅解决方案。

如果您希望我们帮助您了解如何在不通过datacontext访问ViewModel的情况下完成此操作,则需要详细说明您尝试获得的行为。

例如,你可以使用转换器将某些东西的可见性绑定到ViewModel中的布尔值吗?

如果您已经了解上述所有内容,我道歉。

答案 2 :(得分:0)

使用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);
 });