EventToCommand 不能添加到 TriggerActionCollection

EventToCommand cannot be added to TriggerActionCollection

我正在使用 MVVM Light 开发 WPF 项目并尝试使用 EventToCommand,但我收到一条错误消息:

A value of type 'EventToCommand' cannot be added to a collection or dictionary of type 'TriggerActionCollection'."

我正在使用 .NET Framework 4.7.2 和 NuGet 库 Microsoft.Xaml.Behaviors.Wpf。

我看到大多数地方都在谈论 http://schemas.microsoft.com/expression/2010/interactivity, 但据我所知,这现在已被弃用,应该使用 http://schemas.microsoft.com/xaml/behaviors 代替。

在 mvvmlight.net 的更新日志中我发现了这个:

EventToCommand - BL0004.005, The type 'EventToCommand' from assembly 'GalaSoft.MvvmLight.Extras.WPF4' is built with an older version of the Blend SDK, and is not supported in a Windows Presentation Framework 4 project.

我试过更改项目的目标框架版本,但似乎没有什么不同。

如有任何帮助,我们将不胜感激。

<UserControl x:Class="DialogueTree.View.DialogueControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
             xmlns:local="clr-namespace:DialogueTree.View"
             xmlns:command="http://www.galasoft.ch/mvvmlight"
             mc:Ignorable="d" 
             d:DesignHeight="200" d:DesignWidth="200"
             MinHeight="200" MinWidth="200">
<TextBox Text="{Binding Headline}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="LostFocus">
            <command:EventToCommand Command="{Binding Source={StaticResource Locator}, Path=DialogueControlVM.EndEditHeadline}"
                                    CommandParameter="{Binding}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>

来自 MvvmLightEventToCommand 操作基于旧版 Blend SDK 程序集。

  • XML 命名空间 http://schemas.microsoft.com/expression/2010/interactivity
  • CLR 命名空间System.Windows.Interactivity

这些实际上 已弃用 并被您使用的开源 XAML 行为所取代。问题是这些程序集不兼容,因此您不能将 MvvmLight 提供的操作与 XAML 行为一起使用,反之亦然。我想 MvvmLight 将来也会更新以使用这些行为。 Here is an open issue 关于这个主题。

但是,您不需要 EventToCommand,因为 XAML 行为包已经包含一个执行相同操作的命令:InvokeCommandAction。不过,属性 名称可能不同。

<b:EventTrigger EventName="LostFocus">
   <b:InvokeCommandAction Command="{Binding Source={StaticResource Locator}, Path=DialogueControlVM.EndEditHeadline}"
                          CommandParameter="{Binding}"/>
</b:EventTrigger>