UWP with nswag INotify 继承属性问题
UWP with nswag INotify problem with inherited properties
我有一个 DotNetCore Web Api,它的客户端是一个 UWP APP,客户端通过生成的 Nswag 文件与 api 连接。我的 api 侧有一个 class DropDownBase 用作许多不同类型下拉列表 class 的基础 class , 它被用来保存所有下拉列表 classes 的共同属性。在这里,我将向您展示其中一款名为 Calibre.
的 child class
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 class 来制作集合和更多自定义逻辑,这样我就不必编写多余的每个下拉列表的逻辑 class 分别。它按预期工作。
问题
属性 TypeName 存在于 DropDownBase 中并且当它绑定到 UI xaml 来自 child object,例如:“{x:Bind caliber.TypeName, Mode=OneWay}”,然后 TypeName 值被更改,它不会更新 [=80= 上的值] 所以 INotify 系统没有按预期工作。但是如果 属性 直接存在于 class Calibre 而不是从 parent class.
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 文件,我在其中向此 class 添加了额外的内容,仅用于客户端的任何自定义逻辑,因为 nswag 生成了一个partial class 对我来说更容易做到这一点,所以如果任何建议的修复包括将一些代码放入这个 partial class,那可能对我有用。
DropDownBase(部分 class 在客户端用于额外代码)
public partial class DropDownBase
{
[JsonIgnore]
public DropDownBase THIS => this;
}
此问题是由覆盖父级 class 引起的。 nswwag 生成的 Calibre class 中的代码覆盖了 PropertyChanged
事件和 RaisePropertyChanged
方法,这导致隐藏了继承自基 class.
的 RaisePropertyChanged 方法
您可以在 Calibre class 中删除这些覆盖以解决错误。但是你说这些代码是自动生成的,不能更改。
如您所说,您可以将 Typename 属性 添加到子 class。或者直接声明parentclass的对象,绑定dropDownBase.TypeName.
我有一个 DotNetCore Web Api,它的客户端是一个 UWP APP,客户端通过生成的 Nswag 文件与 api 连接。我的 api 侧有一个 class DropDownBase 用作许多不同类型下拉列表 class 的基础 class , 它被用来保存所有下拉列表 classes 的共同属性。在这里,我将向您展示其中一款名为 Calibre.
的 child classDropDownBase(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 class 来制作集合和更多自定义逻辑,这样我就不必编写多余的每个下拉列表的逻辑 class 分别。它按预期工作。
问题
属性 TypeName 存在于 DropDownBase 中并且当它绑定到 UI xaml 来自 child object,例如:“{x:Bind caliber.TypeName, Mode=OneWay}”,然后 TypeName 值被更改,它不会更新 [=80= 上的值] 所以 INotify 系统没有按预期工作。但是如果 属性 直接存在于 class Calibre 而不是从 parent class.
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 文件,我在其中向此 class 添加了额外的内容,仅用于客户端的任何自定义逻辑,因为 nswag 生成了一个partial class 对我来说更容易做到这一点,所以如果任何建议的修复包括将一些代码放入这个 partial class,那可能对我有用。
DropDownBase(部分 class 在客户端用于额外代码)
public partial class DropDownBase
{
[JsonIgnore]
public DropDownBase THIS => this;
}
此问题是由覆盖父级 class 引起的。 nswwag 生成的 Calibre class 中的代码覆盖了 PropertyChanged
事件和 RaisePropertyChanged
方法,这导致隐藏了继承自基 class.
您可以在 Calibre class 中删除这些覆盖以解决错误。但是你说这些代码是自动生成的,不能更改。
如您所说,您可以将 Typename 属性 添加到子 class。或者直接声明parentclass的对象,绑定dropDownBase.TypeName.