如何解决带有 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 类中,而不是从父类继承,则它可以正常工作。
[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));
}
}
[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 为我生成了一个分部类,这对我来说更容易这样做,所以如果任何建议的修复包括将一些代码放入这个部分类,那可能对我有用。
public partial class DropDownBase
{
[JsonIgnore]
public DropDownBase THIS => this;
}
解决方法
这个问题是由父类的覆盖引起的。 nswwag 生成的 Calibre 类中的代码覆盖了 PropertyChanged
事件和 RaisePropertyChanged
方法,导致隐藏从基类继承的 RaisePropertyChanged 方法。
您可以在 Calibre 类中删除这些覆盖来解决错误。但是你说这些代码是自动生成的,不能改变。
如您所说,您可以将 Typename 属性添加到子类中。或者直接声明父类的对象,绑定dropDownBase.TypeName。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。