Windows Presentatioin Framework 4 项目不支持 Prism InvokedCommandAction

Prism InvokedCommandAction is not supported in Windows Presentatioin Framework 4 projects

我想通过调用命令操作来使用 Prism EventTrigger,但在更高版本的 visual studio 中存在错误,尤其是 .Net Framework 4.0 及更高版本。棱镜库中进行了哪些更新以解决此问题?我无法使用 InvokeCommandAction 调用已绑定到 ViewModel 的命令。以下是代码片段和错误消息的屏幕截图。

<igwpf:OutlookBarGroup  x:Class="PrismOutlook.Modules.Mail.Menus.MailGroup"
             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:local="clr-namespace:PrismOutlook.Modules.Mail.Menus"
             xmlns:ig="http://schemas.infragistics.com/xaml"
             xmlns:igwpf="http://schemas.infragistics.com/xaml/wpf"
             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
             xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True"
             Header="Mail">
    <Grid>
        <ig:XamDataTree ItemsSource="{Binding Items}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="ActivaeNodeChanged">
                    <prism:InvokeCommandAction Command="{Binding SelectedCommand}" TriggerParameterPath="NewActiveTreeNode.Data" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
                <ig:XamDataTree.GlobalNodeLayouts>
                <ig:NodeLayout Key="GlobalLayout" TargetTypeName="NavigationItem" DisplayMemberPath="Caption"/>
            </ig:XamDataTree.GlobalNodeLayouts>
        </ig:XamDataTree>
    </Grid>
</igwpf:OutlookBarGroup>

她是我在解决方案输出中看到的错误消息。

我是 Prism 的新手,但对 WPF 和 MVVM 框架有很好的体验。实际上,我正在关注 Brian Lagunas 的 Youtube 教程,我意识到这是一个旧教程,可能对 Prism 源代码和构建进行了一些修改,存在兼容性问题。我用的是Visual studio2019,项目配置是.NetFramework 4.7.2,目前安装的prism版本是7.2.0.1422.

在此先感谢您协助解决此问题。

Xaml 行为现在是一个 nuget 包。

根据: https://devblogs.microsoft.com/dotnet/open-sourcing-xaml-behaviors-for-wpf/

Steps to migrate:

Remove reference to “Microsoft.Expression.Interactions” and “System.Windows.Interactivity” Install the “Microsoft.Xaml.Behaviors.Wpf” NuGet package. XAML files – replace the xmlns namespaces “http://schemas.microsoft.com/expression/2010/interactivity” >and “http://schemas.microsoft.com/expression/2010/interactions“with “http://schemas.microsoft.com/xaml/behaviors“ C# files – replace the usings in c# files “Microsoft.Xaml.Interactivity” and “Microsoft.Xaml.Interactions” with “Microsoft.Xaml.Behaviors”

您的事件触发器还必须是尚未在其他地方处理的路由事件。

https://docs.microsoft.com/en-us/dotnet/api/system.windows.eventtrigger?view=netcore-3.1

这似乎不是 Prism 的问题,而是 Blend SDK 库的问题。您的代码应该可以正常工作,因为 InvokeCommandAction 派生自 System.Windows.Interactivity 中的 TriggerAction<T> 并且版本 7.2.0.1422 不使用它的 old 版本。

以前也有过类似的问题,不是Prism实现导致的,估计是SDK库没有正确注册。在这个问题上看到这个issue for reference and solutions from Prism 5.0 and 6.0. What seems to work in this case is registering the new version of the library manually to the global assembly cache. There is also a

gacutil -i "C:\Program Files (x86)\Microsoft SDKs\Expression\Blend.NETFramework\v4.5\Libraries\System.Windows.Interactivity.dll"

相关 post 中提到的另一个选项是使用 Microsoft.Xaml.Behaviors.Wpf NuGet 包而不是 System.Windows.Interactivity。尽管我建议您尽可能使用它,但它会在与 Prism 的 InvokeCommandAction 一起使用时触发另一个警告,因此一旦 Prism 的新版本基于此新包的类型,您可能应该升级到此解决方案。

Invalid type: expected type is 'TriggerAction', actual type is 'InvokeCommandAction'