0

我正在尝试绑定到我的视图模型上的命令。我正在使用视觉树上的事件触发器。我已经尝试了许多 RelativeSource、FindAncestor 和 AncestorType 的变体,试图绑定到它。每次我得到一个绑定路径表达式错误。

这是我的 xaml 文档大纲:

<Window>
   <Grid>
      <GridView>
         <HierarchyChildTemplate>
             <DataTemplate>
                  <TabControl>
                      <TabItem>
                          <GridView>
                              <RowDetailsTemplate>
                                 <TabControl>
                                     <!--trying to bind a event trigger here to a command on the viewModel -->

这是我尝试过的绑定示例:

<i:Interaction.Triggers>
      <i:EventTrigger EventName="SelectionChanged">
          <i:InvokeCommandAction Command="{Binding Path=SelectionChangedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}}"/>
      </i:EventTrigger>
</i:Interaction.Triggers>

如何从 xaml 中注明的位置绑定到此命令?

4

2 回答 2

0

根据您的视觉树和您在评论中写的内容(我还没有测试过):

<i:Interaction.Triggers>
  <i:EventTrigger EventName="SelectionChanged">
      <i:InvokeCommandAction Command="{Binding Path=DataContext.SelectionChangedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>
  </i:EventTrigger>
</i:Interaction.Triggers>

也就是说,在这种情况下,我建议使用命名绑定....为最顶层的网格(或原始窗口)命名,例如:

<Window Name="MainWindow">
  ....

然后,您可以使用 Bind ElementName

<i:InvokeCommandAction Command="{Binding Path=DataContext.SelectionChangedCommand, 
                                         ElementName=MainWindow}"/>

关于您在评论中所说的(AncestorType 到达错误的网格),使用AncestorLevel=2应该可以帮助您绑定到最顶层的网格。

于 2013-01-21T20:26:32.090 回答
0

最后尝试了这个,它奏效了:

<i:Interaction.Triggers>
  <i:EventTrigger EventName="SelectionChanged">
     <i:InvokeCommandAction Command="{Binding Path=DataContext.SelectionChangedCommand, 
         RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=2,AncestorType={x:Type GridView}}}"/>
   </i:EventTrigger>
</i:Interaction.Triggers>     

这里的关键点是使用 DataContext 和 AncestorLevel=2 对命令进行前缀。

于 2013-01-21T21:00:11.943 回答