我试图通过命令参数在我视图后面的代码中发送依赖属性,将由dp设置的属性发送到我的viewmodel(通过datacontext绑定)。该属性(ParentUserControl)似乎在进入时正确初始化,但我似乎无法发送它。我已经尝试了下面的两个绑定
{!! Form::open(array('route' => 'orders', 'method' => 'GET')) !!}
和
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Command="{Binding CommandTest}"
CommandParameter="{Binding ParentUserControl, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:MyView}}}" />
</ContextMenu>
</DataGrid.ContextMenu>
我使用mvvmlight relay命令,如下所示,但方法test()中的参数始终为null
<ContextMenu>
<MenuItem Command="{Binding CommandTest}"
CommandParameter="{Binding ParentUserControl, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}" />
</ContextMenu>
这是附加在视图后面代码中的依赖项属性:
CommandTest = new RelayCommand<object>(x => test(x));
答案 0 :(得分:0)
使用视图名称查找参数
CommandParameter="{Binding ElementName=MyViewName, Path=ParentUserControl}"
还在ParentUserControl
上添加MyView
的虚拟绑定及其ViewModel(并检查它是否在该级别工作)。
我的意思是,尝试在视图模型上创建一个UserControl Parent
属性,绑定MyView的依赖关系,然后尝试
CommandParameter="{Binding ElementName=MyViewName, Path=DataContext.Parent}"
在后一种情况下,由于它已经在视图模型中,您可能甚至不需要参数。顺便说一句,从MVVM设计模式的角度来看,你不应该将Control作为参数传递给ViewModel ......
答案 1 :(得分:0)
你应该使用这样的东西:
<DataGrid
Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type MyView}}}">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Command="{Binding CommandTest}"
CommandParameter="{Binding PlacementTarget.Tag.ParentUserControl, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:ContextMenu}}}" />
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
您将DataGrid
的代码绑定到MyView
。在MenuItem
为ContextMenu
选择,请使用其PlacementTarget
(即DataGrid)及其Tag
(MyView
)。