【发布时间】:2017-08-20 07:33:25
【问题描述】:
我来自开发 WPF 解决方案,其中更新视图模型的所有属性非常简单:
OnPropertyChanged(String.Empty);
在通用 Windows 平台方案中,我只是使用相同的方法来更新/刷新属性。这在大多数情况下都可以正常工作,但有时会引发如下错误:
COMException 错误 HRESULT E_FAIL 已从对 COM 组件的调用中返回。在 System.ComponentModel.PropertyChangedEventHandler.Invoke(Object sender, PropertyChangedEventArgs e) at GeekyTool.Base.BindableBase.OnPropertyChanged(String propertyName) at Pooo.set_Root(UserRoot value) at Booo.d__26.MoveNext() --- 堆栈跟踪结束从先前抛出异常的位置---在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at GeekyTool.Base.PageBase.d__1.MoveNext() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.AsyncMethodBuilderCore.c.b__6_0(Object state) at System.Threading.WinRTSynchronizationContext.Invoker.InvokeCore()
带有INotifyPropertyChanged 接口实现的OnPropertyChanged 方法如下所示:
public abstract class BindableBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
public virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public virtual bool Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (object.Equals(storage, value))
return false;
storage = value;
OnPropertyChanged(propertyName);
return true;
}
}
您可以探索 mvvm 库,但 INotifyPropertyChanged 实现没有什么不同。
【问题讨论】:
-
我很惊讶这是否曾经在 UWP 上工作过。处理
String.Empty属性名称的代码没有什么特别之处。你有完整的复制品吗? stackoverflow.com/help/mcve -
@MattLacey,使用
string.empty引发INotifyPropertyChanged.PropertyChanged事件是 AFAIK 的“旧”技巧,它在 UWP 中可以正常工作以强制所有(经典或编译的)绑定刷新! -
如果您使用 x:bind,您可以从页面后面的代码中调用 'this.Bindings.Update()' 来强制更新该页面上的所有绑定。
标签: c# mvvm uwp inotifypropertychanged