Xaml 如何使用MVVM模式将事件绑定到通用应用程序中的命令?

Xaml 如何使用MVVM模式将事件绑定到通用应用程序中的命令?,xaml,mvvm,win-universal-app,uwp,Xaml,Mvvm,Win Universal App,Uwp,我希望有人能帮忙 我花了一些时间研究在开发通用应用程序时使用MVVM模式将事件绑定到ViewModel命令的最佳方法。我用的是MVVM灯。 作为测试,我使用组合框的SelectionChanged事件 我读过一些人从Windows8.1/WinRT框架中摘取行为SDK,并在这方面取得了一些成功。我还将Universal App Behaviors SDK包括在我的项目中,并尝试了以下方法(从Windows 8.1示例中组合而成,但使用UWP SDK) XAML <Page xmlns

我希望有人能帮忙

我花了一些时间研究在开发通用应用程序时使用MVVM模式将事件绑定到ViewModel命令的最佳方法。我用的是MVVM灯。 作为测试,我使用组合框的SelectionChanged事件

我读过一些人从Windows8.1/WinRT框架中摘取行为SDK,并在这方面取得了一些成功。我还将Universal App Behaviors SDK包括在我的项目中,并尝试了以下方法(从Windows 8.1示例中组合而成,但使用UWP SDK)

XAML

<Page
   xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
   xmlns:core="using:Microsoft.Xaml.Interactions.Core" />
...
<ComboBox ItemsSource="{Binding InputQuantities}">
   <interactivity:Interaction.Behaviors>
      <core:EventTriggerBehavior EventName="SelectionChanged">
         <core:InvokeCommandAction Command="{Binding SomeComboBoxCommand}" CommandParameter="Foo" />
      </core:EventTriggerBehavior>
   </interactivity:Interaction.Behaviors>
</ComboBox>
<ComboBox ItemsSource="{Binding InputQuantities}" SelectionChanged="{x:Bind Vm.SomeComboBoxCommand }" />
但是,core:InvokeCommandAction不是行为SDK的一部分,我得到的类型无效:预期的类型是“Microsoft.Xaml.Interactivity.ActionCollection”。我尝试使用ActionCollection。。。。但我不确定我知道我在做什么

我成功地将其用于编译绑定并使用Laurent的:

XAML

<Page
   xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
   xmlns:core="using:Microsoft.Xaml.Interactions.Core" />
...
<ComboBox ItemsSource="{Binding InputQuantities}">
   <interactivity:Interaction.Behaviors>
      <core:EventTriggerBehavior EventName="SelectionChanged">
         <core:InvokeCommandAction Command="{Binding SomeComboBoxCommand}" CommandParameter="Foo" />
      </core:EventTriggerBehavior>
   </interactivity:Interaction.Behaviors>
</ComboBox>
<ComboBox ItemsSource="{Binding InputQuantities}" SelectionChanged="{x:Bind Vm.SomeComboBoxCommand }" />
我知道这不是Laurent打算在这里演示的,我认为这样做打破了视图和VM的分离,然后必须在我的视图模型中引用UI组件来获取所选项目。但在我的研究中,我看到过这样做的参考文献

那么,如果这是正确的方法,我如何使用通用应用程序交互行为来实现这一点呢

更新1。 这就是我试图添加的内容,错误地认为我添加的是universal app Behaviors SDK。我当时没有注意到它的目标是Windows8.1。

然而,我的问题仍然存在:为什么
InvokeActioncommand
不起作用,为什么它抛出上述错误?我一上班就会看其他的帖子

更新2 在我的works PC上测试后(与上面的代码完全相同,第一个示例和相同的Behaviors SDK),它运行良好,我得到了我期望的行为。我需要在家用电脑上再次测试,看看出了什么问题。(感谢贾斯汀XL支持我)

更新3
为了完整起见,回家后,我得到了我的项目的最新版本(在我的works PC上签入),现在它也在我的家用PC上工作。我不确定我的Visual Studio处于什么状态,但它已经足够让我困惑,以至于我发布了这个问题。至少这应该作为一份关于如何做标题中描述的事情的文件。谢谢你的帮助。

我们最近似乎经常听到这个问题,有几种不同的说法


我不熟悉通用应用程序,但您尝试使用活动有什么具体原因吗?WPF/Silverlight等设计为数据驱动,您只需将组合框的SelectedItem成员绑定到视图模型中的属性,每当用户选择一个新项时,就会调用setter。通常情况下,为了响应视图模型的其他部分对其进行的更改(例如在主视图和子视图中),您必须执行完全相同的处理,因此将该逻辑放在一个位置通常会使体系结构更加干净。

检查此链接:,解释有关MVVM事件绑定的内容。这完全解耦了视图和视图模型,只将参数传递给命令。

有趣的是,你能告诉我你的UWP sdk的路径吗?是不是
C:\ProgramFiles(x86)\Microsoft SDK\UAP\v0.8.0.0\ExtensionSDK
?另外,您是否正在使用Visual Studio 2015 RTM?哦。不,不是。它的'C:\Program Files(x86)\Microsoft sdk\Windows\v8.1\ExtensionSDKs\BehaviorsXamlSDKManaged\12.0`-我将更新我的问题以反映这一点。哦,好的,那么这是来自Windows 8.1的sdk,您应该使用它。我认为UWP还没有。实际上,你是在编译时出错还是在运行时出错?此行为工作得非常好,我刚刚对其进行了测试。由于定义了
CommandParameter
,请尝试将
RelayCommand
更改为
RelayCommand
?有些事情您无法或不愿对属性执行。例如,单击一个按钮,是的,您可以使用
命令
,但是
双击
按住
呢?您需要一种将事件附加到
命令的方法,
InvokeCommandAction
就是其中之一。它也是MVVM。@贾斯汀:是的,但即使在这种情况下,您仍然绑定到一个属性……您通常只是绑定一个显式调用事件处理程序的附加属性,并且最终会丢失该过程中的某些功能。它是位于底层数据绑定机制之上的一个额外层,在大多数情况下实际上并不需要它。但我想说的是,在许多情况下,您根本无法忽略事件绑定,因此有人提出了这个问题。嗨,Nikita,这个链接指的是WPF和Silverlight。我正在寻找在UWP中实现类似行为的正确方法。最好不要依赖第三方库,比如在你的链接中,而是使用Microsoft的Behavior SDK,我正在学习UWP中尚未提供该SDK。你是否查看了此链接(不确定,但可能会有所帮助):我查看了很多很多博客文章,以获得上面的工作示例。不过,谢谢你提出这个问题,就这个问题而言,这肯定是有意义的。