我正在使用资源字典绑定我的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
答案 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解决了这个问题。其他更好的建议非常受欢迎。
希望此解决方案对其他人有用。 在我的数据网格视图中不需要知道视图
<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);
});