WPF 中引用的 .NET Standard class 库 - 设计时 XAML 中的符号错误

.NET Standard class library referenced in WPF - sign error in XAML at design time

我制作了一个网络标准 class 库。我的目标是 netstandard 1.6。我的 csproj 是这样的:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup Label="Globals">
    <SccProjectName>SAK</SccProjectName>
    <SccProvider>SAK</SccProvider>
    <SccAuxPath>SAK</SccAuxPath>
    <SccLocalPath>SAK</SccLocalPath>
  </PropertyGroup>

  <PropertyGroup>
    <TargetFramework>netstandard1.6</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.Runtime" Version="4.3.0" />
    <PackageReference Include="System.Runtime.Serialization.Primitives" Version="4.3.0" />
    <PackageReference Include="System.Runtime.Serialization.Xml" Version="4.3.0" />
  </ItemGroup>
</Project>

我有一个 WPF 项目,我在其中引用了这个 dll。我可以在 c# 中使用 netstandard dll 的 classes。我也可以在 xaml 中使用它们。我什至得到他们的情报。 但是xaml设计师说,我的xaml无效。我可以编译解决方案,我可以运行应用程序。在运行时间一切正常。但是设计师无法使用它。

这个人 class 看起来像:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Text;

namespace DS.Publications.Common
{
    [DataContract(Namespace = Constants.NamespaceConstants.DataContractNamespace)]
    public class Person : INotifyPropertyChanged
    {
        private string _Title = string.Empty;

        [DataMember]
        public string Title { get { return _Title; } set { Set(ref _Title, value); } }



        private string _ForeName;

        [DataMember]
        public string ForeName { get { return _ForeName; } set { Set(ref _ForeName, value); } }

        private string _LastName;
        [DataMember]
        public string LastName { get { return _LastName; } set { Set(ref _LastName, value); } }



        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
        {

            if (field == null || !field.Equals(value))
            {
                field = value;
                this.OnPropertyChanged(propertyName);
                return true;
            }
            return false;
        }
    }
}

你知道解决方法吗,或者你有什么想法,我该如何纠正?

我也遇到了类似的问题;我在 .NET 标准项目中有一个 class,并尝试使用 Observable 集合将其显示在 ListBox 中。事实证明,XAML 不喜欢 DataContracts。一旦我从我的 .NET Standard class 中删除了 [DataContract] 属性,它就起作用了。我已经就此行为向 Microsoft 提交了 bug report。如果我的假设是正确的,那么只要删除 [DataContract] 属性,错误就会消失。

至于解决方案。您可以删除 DataContract(它不会像您需要的那样工作,否则您不会使用它,我猜......)或者为每个 class 创建一个代理对象,它反映了功能并重定向了函数调用到原始对象的基础副本。我没有尝试这是否足以阻止 XAML 触发数据合同(如果发生这种情况)。

它可能在编译模式下工作,因为它仅被定义为资源。只要它不主动显示,它就可能起作用。可能是设计师试图展示资源?

这可能与另一个错误 (here and ) 有关,其中 .NET Standard 的依赖项不 importet/translated 到其他项目。此错误报告描述了当从引用的 DLL 访问功能时发生崩溃。基本上你有一个使用第 3 方库 X 的 .NET 标准库和一个使用你的 .NET 标准库 Y 的 .NET Framework 项目 Z。一旦你在 Y 中调用一个方法,而这个方法又调用 X,你就完蛋了。您需要手动将 Y 中的所有引用导入您的项目 Z。

至于这可能是如何相关的。数据协定是 .NET Standard 独有的功能,旨在取代 Serializable。但是它们似乎有更多的功能,这些功能是由 XAML 前端以某种方式触发的。由于数据协定不适用于 .NET Framework,一切都崩溃了。

如果您设法找到解决方案,请告诉我们,因为此错误需要 'proper' 解决方法...

我还没有真正找到解决这个问题的方法...我已经将我的 netstandard 库的目标框架设置回 netstandard1.3。以 1.3 为目标时,一切正常。我希望,下一个 VS-Update 会带来修复。

PS。当我将目标设置为 netstandard1.3 时,我遇到了问题,即找到了旧的 netstandard1.6 二进制文件,直到我真正清理了如下所示的解决方案: How to really clean the solution.