微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 nswag INotify 问题的 UWP 继承属性

如何解决带有 nswag INotify 问题的 UWP 继承属性

我有一个 DotNetCore Web Api,它的客户端是一个 UWP APP,客户端通过生成的 Nswag 文件与 api 连接。我的 api 端有一个 DropDownBase 类,它用作许多不同类型下拉类的基类,它用于保存所有下拉类的通用属性在这里,我将向您展示一个名为 Calibre 的子类。

DropDownBase(api 端)

public class DropDownBase : DefaultBaseColumn
{
    public Guid Id { get; set; }
    public string TypeName { get; set; }
}

//This class is irrelevant but putting it here for full context.
public class DefaultBaseColumn : IDefaultBaseColumn
{
    public Guid CreatedBy { get; set; }
    public DateTimeOffset Created { get; set; }
    public string CreatedByName { get; set; }
    public Guid? ModifiedBy { get; set; }
    public DateTimeOffset? Modified { get; set; }
    public string ModifiedByName { get; set; }
    [DefaultValue(true)]
    public bool IsActive { get; set; } = true;
}

口径(api方面)

public class Caliber : DropDownBase
{  }

现在需要注意的是,在客户端我使用这个 DropDownBase 类来创建集合和更多的自定义逻辑,这样我就不必为每个下拉类单独编写冗余逻辑。它按预期工作。

问题

属性 TypeName 存在于 DropDownBase 中,并且当它从子对象绑定到 UI xaml 时,例如:“{x:Bind caliber.TypeName,Mode=OneWay }”,然后更改 TypeName 值,它不会更新 UI 上的值,因此 INotify 系统无法按预期工作。但是,如果该属性直接存在于 Calibre 类中,而不是从父类继承,则它可以正常工作。

DropDownBase(nswag 客户端生成文件

[System.CodeDom.Compiler.GeneratedCode("njsonSchema","10.2.1.0 (Newtonsoft.Json v12.0.0.0)")]
public partial class DropDownBase : DefaultBaseColumn,System.ComponentModel.INotifyPropertyChanged
{
    private System.Guid _id;
    private string _typeName;

    [Newtonsoft.Json.JsonProperty("id",required = Newtonsoft.Json.required.disallowNull,NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
    public System.Guid Id
    {
        get { return _id; }
        set 
        {
            if (_id != value)
            {
                _id = value; 
                RaisePropertyChanged();
            }
        }
    }

    [Newtonsoft.Json.JsonProperty("typeName",required = Newtonsoft.Json.required.Default,NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
    public string TypeName
    {
        get { return _typeName; }
        set 
        {
            if (_typeName != value)
            {
                _typeName = value; 
                RaisePropertyChanged();
            }
        }
    }


    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
    protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) 
            handler(this,new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    }

}

Calibre(nswag 客户端生成文件

[System.CodeDom.Compiler.GeneratedCode("njsonSchema","10.2.1.0 (Newtonsoft.Json v12.0.0.0)")]
public partial class Caliber : DropDownBase,System.ComponentModel.INotifyPropertyChanged
{


    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
    protected virtual void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) 
            handler(this,new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    }

}

请注意,对于我的情况,手动更改 nswwag 生成文件不是理想的解决方案,因为我们经常生成这些文件,然后任何手动更改都将被覆盖。我只是想让 typename 属性通知 UI 它已更改。

在客户端,我还有第二个 DropDownBase 文件,我在该文件中为该类添加了额外的内容,仅用于客户端的任何自定义逻辑,因为 nswag 为我生成一个分部类,这对我来说更容易这样做,所以如果任何建议的修复包括将一些代码放入这个部分类,那可能对我有用。

DropDownBase(客户端的部分类用于额外代码

public partial class DropDownBase
{
    [JsonIgnore]
    public DropDownBase THIS => this;
}

解决方法

这个问题是由父类的覆盖引起的。 nswwag 生成的 Calibre 类中的代码覆盖了 PropertyChanged 事件和 RaisePropertyChanged 方法,导致隐藏从基类继承的 RaisePropertyChanged 方法。

您可以在 Calibre 类中删除这些覆盖来解决错误。但是你说这些代码是自动生成的,不能改变。

如您所说,您可以将 Typename 属性添加到子类中。或者直接声明父类的对象,绑定dropDownBase.TypeName

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。