在Silverlight C#中频繁调用INotifyPropertyChanged会出错

3

我创建了一个基础视图模型,将所有视图模型的公共属性放入其中,并由我的C# Silverlight应用程序的所有视图模型实现。

我的基础视图模型还为所有视图模型实现了INotifyPropertyChanged接口。

public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

经常调用PropertyChanged事件时,会出现以下错误:
Error HRESULT E_FAIL has been returned from a call to a COM component.

堆栈跟踪是

   在MS.Internal.XcpImports.CheckHResult(UInt32 hr)处检查HResult
   在MS.Internal.XcpImports.SetValue(IManagedPeerBase obj, DependencyProperty property, DependencyObject doh)处设置值
   在MS.Internal.XcpImports.SetValue(IManagedPeerBase doh, DependencyProperty property, Object obj)处设置值
   在System.Windows.DependencyObject.SetObjectValueToCore(DependencyProperty dp, Object value)处设置对象值
   在System.Windows.DependencyObject.SetEffectiveValue(DependencyProperty property, EffectiveValueEntry& newEntry, Object newValue)处设置有效值
   在System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)处更新有效值
   在System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp, Object value, Boolean allowReadOnlySet, Boolean isBindingInStyleSetter)处设置值
   在System.Windows.Controls.Control.set_DefaultStyleKey(Object value)处设置默认样式键
   在System.Windows.Controls.ContentControl..ctor()处构造内容控件
   在MS.Internal.CoreTypes.GetCoreWrapper(UInt32 typeId)处获取核心包装器
   在MS.Internal.ManagedPeerTable.EnsureManagedPeer(IntPtr unmanagedPointer, Int32 typeIndex, Type type, Boolean preserveManagedObjectReference)处确保托管对等体
   在MS.Internal.XcpImports.ConvertDO(IntPtr doPointer, Int32 typeIndex, Boolean releaseObjectReference)处转换DO
   在MS.Internal.XcpImports.ConvertType(CValue outVal, Int32 typeIndex, Boolean releaseObjectReference, Boolean deleteBuffer, IManagedPeerBase fromObject)处转换类型
   在MS.Internal.XcpImports.ConvertCValueForManagedWithType(Type propertyType, CValue& outVal, Int32 outDOType, Boolean releaseObjectReference, Boolean deleteBuffer, IManagedPeerBase fromObject)处转换CValue为托管类型
   在MS.Internal.XcpImports.GetValue(IManagedPeerBase managedPeer, DependencyProperty property)处获取值
   在System.Windows.DependencyObject.GetValueInternal(DependencyProperty dp)处获取对象的内部值
   在System.Windows.FrameworkElement.GetValueInternal(DependencyProperty dp)处获取框架元素的内部值
   在System.Windows.FrameworkElement.get_Parent()处获取父级元素
   在Telerik.Windows.RadRoutedEventHelper.FindParent(FrameworkElement item)处查找父级
   在Telerik.Windows.RadRoutedEventHelper.BuildRoute(DependencyObject element, EventRoute route, RadRoutedEventArgs args)处构建路由
   在Telerik.Windows.RadRoutedEventHelper.RaiseEvent(DependencyObject element, RadRoutedEventArgs args)处引发事件
   在Telerik.Windows.DependencyObjectExtensions.RaiseEvent(DependencyObject element, RadRoutedEventArgs e)处引发事件
   在Telerik.Windows.Controls.Selector.OnSelectionChanged(SelectionChangedEventArgs e)处选择改变时触发
   在Telerik.Windows.Controls.RadComboBox.OnSelectionChanged(SelectionChangedEventArgs e)处选择改变时触发
   在Telerik.Windows.Controls.Selector.OnSelectionChanged(Object sender, SelectionChangedEventArgs e)处选择改变时触发
   在Telerik.Windows.Controls.Selector.SelectionChanger`1.InvokeSelectionChangedEvent()处调用选择改变事件
   在Telerik.Windows.Controls.Selector.SelectionChanger`1.End()处结束选择
   在Telerik.Windows.Controls.Selector.SelectionChanger`1.SelectJustThisItem(T item)处只选择此项
   在Telerik.Windows.Controls.Selector.SelectItemWithValue(Object value)处选择具有值的项
   在Telerik.Windows.Controls.Selector.CoerceSelectedValue(Object value)处强制选择的值
   在Telerik.Windows.Controls.Selector.OnCoerceSelectedValue(DependencyObject sender, Object newValue)处在强制选择值时触发
   在Telerik.Windows.PropertyMetadata.DoCoercion(Func`3 areValuesEqual, DependencyObject d, DependencyProperty dp, CoerceValueCallback coerceCallback, Object defaultBaseValue, Boolean forceNewBaseValue, Boolean& isReentrantImplicitCoercion)处执行强制转换
   在Telerik.Windows.PropertyMetadata.PropertyChangeHook.OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)处属性更改时触发
   在System.Windows.DependencyObject.RaisePropertyChangeNotifications(DependencyProperty dp, Object oldValue, Object newValue)处引发属性更改通知
   在System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)处更新有效值

你是否会在后台线程上更改任何属性? - SLaks
不要在UI线程中更改它。 - yrahman
5
我认为这可能与您使用的Telerik控件有关。您尝试过联系技术支持吗?否则,您需要创建一个可以重现问题的样本。我也像您一样实现了带INP的ViewModelBase,但是我没有问题,所以我认为这个问题可能与您绑定数据或Telerik的方式有关。 - Michael Sync
你正在设置哪些属性值?在我看来,似乎设置了无效的值。我怀疑这不是由于调用频率引起的。 - Jeff Yates
1个回答

1

我觉得你的INotifyPropertyChanged实现没有问题,但是我怀疑你的代码导致了无限循环。

如果你可以分享一个能够重现你问题的示例项目,人们可能会帮助你解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接