在WPF中引用的.NET Standard类库-设计时XAML签名错误

5
我已经创建了一个 netstandard 类库。我将其目标设置为 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的类,也可以在xaml中使用它们。我甚至可以得到它们的智能提示。但是xaml设计师说我的xaml无效。我可以编译解决方案,运行应用程序。运行时一切正常。但是设计师无法使用它。

enter image description here

Person类如下:

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;
        }
    }
}

你知道有什么解决方法,或者有什么想法,可以帮助我纠正这个问题吗?


你的类是如何定义的? - CShark
我添加了Person类的源代码。 - lvoros
2个回答

0

我并没有真正找到解决这个问题的方法... 我将我的netstandard库的目标框架设置回netstandard1.3。当目标为1.3时,一切都正常工作。我希望修复程序会随着下一个VS更新而来。

PS. 当我将目标设置为netstandard1.3时,我遇到了一个问题,就是旧的netstandard1.6二进制文件被发现,直到我像这里一样真正清理了解决方案: 如何真正清理解决方案。


0

我也遇到了类似的问题;我在一个.NET Standard项目中有一个类,并尝试使用Observable Collection在ListBox中显示它。结果发现,XAML不喜欢DataContracts。只要我从我的.NET Standard类中删除了[DataContract]属性,它就可以工作了。我已经向Microsoft提交了错误报告,关于这种行为。如果我的假设是正确的,只要您删除[DataContract]属性,错误应该会消失。

至于解决方案。您可以删除DataContract(但这样做将无法正常工作,因为您需要它,否则您就不会使用它,我猜...)或为每个类创建代理对象,该对象镜像功能并将函数调用重定向到原始对象的底层副本。不过,我没有尝试过是否足以防止XAML触发数据合同(如果正在进行的话)。

它可能在编译模式下工作,因为它仅被定义为资源。只要它没有被主动显示,它可能就能正常工作。也许设计师试图显示资源?

这可能与另一个 bug 有关(此处此处),其中 .NET Standard 的依赖项未被导入/转换到其他项目中。此 bug 报告描述了当访问来自引用 DLL 的功能时,会出现错误。基本上,你有一个使用第三方库 X 的 .NET Standard 库,以及一个使用你的 .NET Standard 库 Y 的 .NET Framework 项目 Z。一旦你调用 Y 中调用 X 的方法,你就完蛋了。你需要手动将 Y 中的所有引用导入到你的项目 Z 中。
至于这可能是如何相关的。数据契约是 .NET Standard 的一个特性,旨在替代Serializable。但它们似乎有更多的功能被 XAML 前端触发。由于数据契约对 .NET Framework 不可用,因此一切都崩溃了。
如果你找到了解决方案,请告诉我们,因为这个 bug 需要一个“合适的”解决方法...

谢谢你的回答。我已经从我的类中删除了DataContract和DataMember属性,但这并没有帮助解决问题。 - lvoros
你在这样做之后重新编译了你的库吗? - CShark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接