【问题标题】:How to access the View inside the DataTemplate from Code behind如何从后面的代码访问 DataTemplate 中的视图
【发布时间】:2012-04-10 15:01:04
【问题描述】:

我正在使用资源字典绑定我的视图模型和视图,如下所示

<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

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

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

    MyViewModel model = (MyViewModel) DataContext;
    

    【讨论】:

    • 我很抱歉问托木斯克。我想访问 MyView 而不是 MyViewModel。我在上面的问题中输入了错误的内容(刚刚编辑过)。
    【解决方案2】:

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

    但是,只要稍加努力,您几乎总能绕过从视图中直接访问 ViewModel。 MVVM 或 MVC 的全部意义在于 View 与 ViewModel 之间没有依赖关系。

    您应该在 WPF for MVVM 中研究的内容包括:

    • 附加属性
    • 附加行为
    • 调解员
    • 值转换器
    • 标记扩展

    您需要了解所有这些,才能为您在使用 MVVM 时遇到的一些问题找到优雅的解决方案。

    如果您希望我们帮助您弄清楚如何在不通过 datacontext 访问 ViewModel 的情况下执行此操作,您需要指定有关您尝试获得的行为的更多详细信息。

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

    如果您已经了解以上所有内容,我深表歉意。

    【讨论】:

    • 您在上面的列表 - 我只知道一些事情(仍在学习)。我最近才使用 MVVM。对于更复杂的数据网格操作,我认为 MVVM 对我的技能水平来说太过分了。
    【解决方案3】:

    刚刚使用 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>
    

    在视图模型中

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

    在视图模型构造函数中

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多