C#学习教程:WPF:PropertyChangedCallback仅触发一次每次更新该属性时,我都需要触发另一个事件。为此,我添加了一个带有PropertyChangedCallback事件的FrameworkPropertyMetadata。由于某种原因,此事件仅调用一次,并且不会在VisibleItems下次更改时触发。XAML:CurrentTables是MyViewModel上的DependencyProperty。CurrentTable经常变化。我可以将另一个WPF控件绑定到CurrentTables,我看到了UI中的更改。这是我使用PropertyChangedCallback连接VisibleItems的方式publicstaticreadonlyDependencyPropertyVisibleItemsProperty=DependencyProperty.Register("VisibleItems",typeof(IList),typeof(MyFilterList),newFrameworkPropertyMetadata(null,FrameworkPropertyMetadataOptions.AffectsRender,newPropertyChangedCallback(VisiblePropertyChanged)));publicIListVisibleItems{get{return(IList)GetValue(VisibleItemsProperty);}set{SetValue(VisibleItemsProperty,value);通过进入VisiblePropertyChanged,我可以看到它在首次设置CurrentTables时触发。但不是下一次。更新由于你们中的一些人质疑CurrentTables的修改方式,它在更改时完全重新分配:OnDBChange()...CurrentTables=newList(MainDatabaseDataAdapter.GetTables(this.SelectedServer,this.SelectedDatabase));每次每次更改都会调用此行,但我的VisiblePropertyChanged处理程序仅在第一次调用。更新如果我直接分配VisibleItems,每次都会调用处理程序!TestFilterList.VisibleItems=newList(Enumerable.Range(1,DateTime.Now.Second).ToList().Select(s=>s.ToString()).ToList());所以,看起来问题源于DependencyProperty(VisibleItems)watchanotherDependencyProperty(CurrentTables)。绑定以某种方式适用于第一个属性更改但不适用于后续属性?正如你们中的一些人所建议的那样,试图用snoop来检查这个。您是否将“本地”值(即直接分配给依赖属性设置器)设置为也具有OneWay绑定的依赖属性?如果是这样,设置本地值将删除绑定,如MSDN依赖属性概述中所述:绑定被视为本地值,这意味着如果您设置另一个本地值,您将删除绑定。当需要在依赖属性上存储本地值时,依赖属性机制没有太多其他东西可以提供。它无法通过绑定发送值,因为绑定“指向”错误的方式。当设置为本地值时,它不再显示从绑定中获得的值。因为它不再显示绑定值,所以它删除了绑定。绑定消失后,当绑定的源属性更改其值时,将不再调用PropertyChangedCallback。这可能就是为什么没有调用回调的原因。如果将绑定设置为TwoWay,绑定系统确实可以将您设置的“本地”值存储在绑定的源属性中。在这种情况下,不需要解除绑定,因为依赖属性机制可以将值存储在源属性中。这种情况不会导致堆栈溢出,因为会发生以下情况:这里的关键点是,如果为值未更改的属性触发PropertyChanged事件,则不会调用绑定到您的属性的依赖属性上的任何PropertyChangedCallback。为简单起见,我省略了上面的IValueConverter。如果您有转换器,请确保它在两个方向上都能正确转换值。我还假设另一端的属性是实现INotifyPropertyChanged的??对象的视图模型属性。绑定的源端可能有另一个依赖属性。依赖属性机制也可以处理它。碰巧的是,WPF(和Silverlight)不包括堆栈溢出检测。如果在PropertyChangedCallback中,您将依赖属性的值设置为其新值(例如,通过递增整数值属性或将字符串附加到字符串值属性),您将得到堆栈溢出.我的代码中遇到了同样的问题,Luke是对的。我在PropertyChangedCallback中使用mystake调用SetValue,导致潜在的无限循环。WPF防止这种静默禁止使用回调!!我的WPFUserControl是PatchRenderer我的C#属性是注意:[Description("Notedisplayedwithstaricons"),Category("Data"),Browsable(true),EditorBrowsable(EditorBrowsableState.Always),DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]publicintNote{get{return(int)GetValue(NoteProperty);}set{SetValue(NoteProperty,value);/*不要在这里再放任何东西*/}}我的WPF属性publicstaticreadonlyDependencyPropertyNoteProperty=DependencyProperty.Register("Note",typeof(int),typeof(PatchRenderer),newPropertyMetadata(newPropertyChangedCallback(PatchRenderer.onNoteChanged)));privatestaticvoidonNoteChanged(DependencyObjectd,DependencyPropertyChangedEventArgse){//这是错误:在回调中调用setter//((PatchRenderer)d).Note=(int)e.NewValue;//以下内容被错误地放置在Notesetter中。//把它放在这里是有意义的。//此方法旨在显示星星icons//表示音符((PatchRenderer)d).UpdateNoteIcons();如果您只是实例化MyFilterList并通过以下方式设置VisibleItems:varcontrol=newMyFilterList();control.VisibleItems=newList();控制.VisibleItems=newList();您可能会看到PropertyChangedCallback每次都在发生,这意味着问题在于绑定,而不是回调。确保你没有绑定错误,你正在提高PropertyChanged,并且你没有破坏绑定(例如通过在代码中设置VisibleItems)你可能会遇到集合内容正在更改而不是实际实例的问题.在这种情况下,您将使用ObservableCollection并执行以下操作:以上是C#学习教程:WPF:PropertyChangedCallbackonlytriggersonce。多多注意—publicstaticreadonlyDependencyPropertyVisibleItemsProperty=DependencyProperty.Register("VisibleItems",typeof(IList),typeof(MyFilterList),newFrameworkPropertyMetadata(null,FrameworkPropertyMetadataOptions.AffectsRender,newPropertyChangedCallback(VisibleItemsChanged)));privatestaticvoidVisibleItemsChanged(DependencyObjectd,DependencyPropertyChangedEventArgse){varmyList=dasMyFilterList;如果(myList==null)返回;myList.OnVisibleItemsChanged(e.NewValue作为IList,e.OldValue作为IList);}protectedvirtualvoidOnVisibleItemsChanged(IListoldValue,IList){varoldCollection=oldValueasINotifyCollectionChanged;如果(oldCollection!=null){oldCollection.CollectionChanged-=VisibleItems_CollectionChanged;}varnewCollection=newValueasINotifyCollectionChanged;如果(新集合on!=null){newCollection.CollectionChanged+=VisibleItems_CollectionChanged;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
