c# - 在 XAML 中将 CallMethodAction 中的 TargetObject 设置为父 DataContext 中的 ViewModel

标签 c# wpf xaml mvvm uwp

我正在创建一个 UWP 应用,到目前为止,我一直在使用 CallMethodAction 从 ViewModel 调用方法,并且运行良好。

但是现在,我尝试对 ListView 内的某些按钮使用相同的方法,但当我单击该按钮时没有任何反应。 XAML代码是:

<Page.DataContext>
    <vm:RoomPageViewModel x:Name="ViewModel" />
</Page.DataContext>

<ListView x:Name="ActuatorListView"
          ItemsSource="{x:Bind ViewModel.Room.Actuators}">
  <ListView.ItemTemplate>
     <DataTemplate x:DataType="data:Actuator">
        <Button x:Name="OnButton" Content="On">
           <Interactivity:Interaction.Behaviors>
                  <Core:EventTriggerBehavior 
                           EventName="Click" 
                           SourceObject="{Binding ElementName=OnButton}">
                     <Core:CallMethodAction 
                        MethodName="OnButton_Click"
                        TargetObject="{Binding ElementName=ViewModel, Mode=OneWay}" />
                  </Core:EventTriggerBehavior>
               </Interactivity:Interaction.Behaviors>
            </Button>                            
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

我尝试了多种方法来访问父 DataContext,但发现没有任何效果。

最佳答案

由于您的 View 模型实际上不是元素,因此您不能将其与ElementName 一起使用进行绑定(bind)。

根据您的情况,正确的解决方案是为您的页面指定一个名称 (x:Name="Page") 并绑定(bind)到其 DataContext:

<Core:CallMethodAction 
   MethodName="OnButton_Click"
   TargetObject="{Binding Path=DataContext, ElementName=Page, Mode=OneWay}" />

关于c# - 在 XAML 中将 CallMethodAction 中的 TargetObject 设置为父 DataContext 中的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40708995/

相关文章:

c# - 从 Datagrid 单元格或行中获取文本

c# - MyList = new List<int>();有效,但 MyList.Clear();没有

c# - 如何检查用户是否已在 AdMob for Unity 中完成视频?

c# - 是否有一种简单的方法来导航 List<t> 对象?

xaml - 将 Autocad DXF 转换为 Microsoft XAML

c# - 绑定(bind)到另一个命名空间中的属性?

c# - 如何从gridview页脚C#中的文本框中获取值?

c# - F# List.map 在 C# 中等效?

c# - MVVM 绑定(bind)到数组索引

c# - Process.Start() 问题 - 未显示 GUI