【发布时间】:2021-04-06 04:27:42
【问题描述】:
3 步嵌套字符串属性未更新 UI。当我更新 EvidenceName 属性时,它不会立即反映在 UI 上,直到我返回并再次访问此页面,在这种情况下视图模型会再次初始化。
我有一个带有以下代码的 xaml 页面:
<TextBlock Text="{x:Bind ViewModel.SelectedEvidence.EvidenceName, Mode=OneWay}" />
后面代码中的 ViewModel 属性:
public EvidenceViewModel ViewModel { get; } = new EvidenceViewModel();
EvidenceViewModel 中的 Selected Evidence 属性:
public Evidence SelectedEvidence
{
get => _selectedEvidence;
set => Set(ref _selectedEvidence, value); //this calls for RaisePropertyChanged
}
EvidenceViewModel 派生自 Observable 类,用于引发属性更改。
public class Observable : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (Equals(storage, value))
{
return;
}
storage = value;
OnPropertyChanged(propertyName);
}
protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Evidence 类中的 EvidenceName 属性
public string EvidenceName
{
get { return _evidenceName; }
set
{
if (_evidenceName != value)
{
_evidenceName = value;
RaisePropertyChanged();
}
}
}
更新 1
如果我直接在 EvidenceViewModel 中放置一个简单的字符串属性并将 UI 文本块绑定到该字符串属性,则更改会按预期实时反映。
更新 2
经过进一步调试,我发现类从父类继承的任何属性在绑定中都不能正常工作,因此 EvidenceName 属性实际上来自父类 EvidenceBase 并被继承到子类 Evidence。
更新 3
Nswagger 为客户端生成的文件中的证据类代码
EvidenceBase 类的代码
EvidenceName 属性,实际存在于 EvidenceBase 类中
EvidenceBase中的RasiePropertyChanged代码
【问题讨论】:
-
能否提供
RaisePropertyChanged的源码?代码中包含Set、OnPropertyChanged和RaisePropertyChanged有点奇怪,它们都来自同一个MVVM工具包吗? -
@MartinZikmund raise 属性更改机制来自生成的 nswag 文件,因为这些模型类实际上是 dotnetcore 中的 db 表,并且 nswagger 用于将其与客户端应用程序链接。
-
@MartinZikmund 请参阅我的问题的更新 3,这可能有助于澄清您关于 PropertyChanged 的问题,并且此 propertyChanged 事件适用于所有属性,除非它们是从像这种情况下的抽象类继承的。