结论:.net framework框架下的wpf项目使用Microsoft.Toolkit.Mvvm需慎重。

Microsoft.Toolkit.Mvvm是MVVM Light的接力者,今天在目标框架为framework4.6.1的wpf项目中使用Microsoft.Toolkit.Mvvm7.1.1出现了一个离谱的编译时错误,前提是打开了 工具>选项>环境>预览功能>适用于NET Framework的新版WPF XAML设计器(需要重启) 。(Visual Studio 2019 16.10以上版本)

相关链接:https://docs.microsoft.com/zh-cn/visualstudio/xaml-tools/xaml-design-time-sample-data?view=vs-2019

定义如下类:

public class Class1 : Microsoft.Toolkit.Mvvm.ComponentModel.ObservableObject
{
        
}

然后在xaml文件中使用它:

<Window.Resources>
        <local:Class1 x:Key="bbb"/>
</Window.Resources>

标红处报错: XDG004无法分配指定的值。应是以下类型:"Object"  ,导致当前xaml设计器无法正常显示,但启动程序的话,正常运行。

将xaml代码改为:

<Window.DataContext>
        <local:Class1 x:Name="aaa"/>
</Window.DataContext>

标红处报错报错: XDG004无法分配指定的值。应是以下类型:"Object XDG004附加的属性"Name"只能应用到从"Obiect"派生的类型。 ,导致当前xaml设计器无法正常显示,启动程序的话,正常运行。

这个错误就很离谱,然后我修改了 Class1 类,将其父类删除:

public class Class1
{
        
}

程序没有报错。这时我将 Microsoft.Toolkit.Mvvm.ComponentModel.ObservableObject 重新作为 Class1 类的父类,并将 工具>选项>环境>预览功能>适用于NET Framework的新版WPF XAML设计器(需要重启) 关闭。

将 工具>选项>环境>预览功能>适用于NET Framework的新版WPF XAML设计器(需要重启) 关闭后,程序不再报错。

这时我另创一个基于.net 5的wpf项目如上进行实验,错误竟然消失了。猜测是因为 Microsoft.Toolkit.Mvvm.ComponentModel.ObservableObject 中频繁使用的可空引用类型,导致 工具>选项>环境>预览功能>适用于NET Framework的新版WPF XAML设计器(需要重启) 关这个功能异常,这个特性C#8.0才有,而Framework最高支持C#7.3。关闭该功能,可以解决问题。但我不知道是否还有其它隐患?Microsoft.Toolkit.Mvvm是一种很新的MVVM框架,对于基于.net framework的wpf项目,还是使用MVVM Light比较稳妥。

 

相关链接:https://docs.microsoft.com/zh-cn/windows/communitytoolkit/mvvm/introduction