【发布时间】:2012-03-22 02:34:17
【问题描述】:
我创建了一个基础视图模型,用于将所有视图模型的所有通用属性放入其中,并且它正在由我的 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 小时) 在 MS.Internal.XcpImports.SetValue(IManagedPeerBase obj,DependencyProperty 属性,DependencyObject doh) 在 MS.Internal.XcpImports.SetValue(IManagedPeerBase doh,DependencyProperty 属性,对象 obj) 在 System.Windows.DependencyObject.SetObjectValueToCore(DependencyProperty dp,对象值) 在 System.Windows.DependencyObject.SetEffectiveValue(DependencyProperty 属性,EffectiveValueEntry& newEntry,对象 newValue) 在 System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty 属性,EffectiveValueEntry oldEntry,EffectiveValueEntry&newEntry,ValueOperation 操作) 在 System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp,对象值,布尔 allowReadOnlySet,布尔 isBindingInStyleSetter) 在 System.Windows.Controls.Control.set_DefaultStyleKey(对象值) 在 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) 在 MS.Internal.XcpImports.ConvertType(CValue outVal,Int32 typeIndex,布尔 releaseObjectReference,布尔 deleteBuffer,IManagedPeerBase fromObject) 在 MS.Internal.XcpImports.ConvertCValueForManagedWithType(类型 propertyType,CValue& outVal,Int32 outDOType,布尔 releaseObjectReference,布尔 deleteBuffer,IManagedPeerBase fromObject) 在 MS.Internal.XcpImports.GetValue(IManagedPeerBase managedPeer,DependencyProperty 属性) 在 System.Windows.DependencyObject.GetValueInternal(DependencyProperty dp) 在 System.Windows.FrameworkElement.GetValueInternal(DependencyProperty dp) 在 System.Windows.FrameworkElement.get_Parent() 在 Telerik.Windows.RadRoutedEventHelper.FindParent(FrameworkElement 项) 在 Telerik.Windows.RadRoutedEventHelper.BuildRoute(DependencyObject 元素,EventRoute 路由,RadRoutedEventArgs 参数) 在 Telerik.Windows.RadRoutedEventHelper.RaiseEvent(DependencyObject 元素,RadRoutedEventArgs 参数) 在 Telerik.Windows.DependencyObjectExtensions.RaiseEvent(DependencyObject 元素,RadRoutedEventArgs e) 在 Telerik.Windows.Controls.Selector.OnSelectionChanged(SelectionChangedEventArgs e) 在 Telerik.Windows.Controls.RadComboBox.OnSelectionChanged(SelectionChangedEventArgs e) 在 Telerik.Windows.Controls.Selector.OnSelectionChanged(对象发送者,SelectionChangedEventArgs e) 在 Telerik.Windows.Controls.Selector.SelectionChanger`1.InvokeSelectionChangedEvent() 在 Telerik.Windows.Controls.Selector.SelectionChanger`1.End() 在 Telerik.Windows.Controls.Selector.SelectionChanger`1.SelectJustThisItem(T 项目) 在 Telerik.Windows.Controls.Selector.SelectItemWithValue(对象值) 在 Telerik.Windows.Controls.Selector.CoerceSelectedValue(对象值) 在 Telerik.Windows.Controls.Selector.OnCoerceSelectedValue(DependencyObject 发件人,对象 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,对象 oldValue,对象 newValue) 在 System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty 属性,EffectiveValueEntry oldEntry,EffectiveValueEntry&newEntry,ValueOperation 操作) 在 System.Windows.DependencyObject.RefreshExpression(DependencyProperty dp) 在 System.Windows.Data.BindingExpression.SendDataToTarget() 在 System.Windows.Data.BindingExpression.SourceAcquired() 在 System.Windows.Data.Debugging.BindingBreakPoint.c__DisplayClass4.【问题讨论】:
-
您是否曾经更改过后台线程上的任何属性?
-
不,它总是在 ui 线程中改变
-
我认为这可能与您正在使用的 Telerik 控件有关。您是否尝试与技术支持联系?否则,您需要制作一个可以重现该问题的样本。我也有像你一样实现的带有 INP 的 ViewModelBase,但我没有问题,所以我认为这个问题可能与你绑定或 Telerik 的方式有关。
-
您设置了哪些属性值?在我看来,正在设置一个无效值。我怀疑这取决于电话的频率。
标签: c# silverlight telerik inotifypropertychanged silverlight-5.0