将代码隐藏中的DependencyProperty绑定到CommandParameter

时间:2017-02-26 21:01:07

标签: c# wpf

我试图通过命令参数在我视图后面的代码中发送依赖属性,将由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));

2 个答案:

答案 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。在MenuItemContextMenu选择,请使用其PlacementTarget(即DataGrid)及其TagMyView)。