当前位置: 首页 > 编程语言 > C#

C#学习教程:.Net4.0中Binding的DelayedAttributecomesfrom.Net4.5分享

时间:2023-04-11 00:05:00 C#

TheDelayedAttributecomesfrom.Net4.5in.Net4.0Howtoimplement.Net4.5aboutBindingin.Net4.0(说明这里)延迟属性?我知道我无法继承BindingBase,因为ProvideValue是密封的。我可以实现MarkupExtension但这意味着我现在必须重写BindingExtension中的所有属性还有其他方法吗?我将创建一个指定延迟时间的AttachedProperty。AttachedProperty将在绑定值更改时启动(或重置)计时器,并在指定的时间过去后手动更新绑定源。您可以使用以下方法更新源绑定:BindingOperations.GetBindingExpressionBase(dependencyObject,dependencyProperty).UpdateSource();编辑我今天正在修复一些旧代码中的错误,并注意到它使用附加行为实现了延迟的属性更改通知。我想通了,所以点击我在代码中评论的链接,发现自己刚刚发布了一个关于延迟绑定的问题。最常见的答案,也是我目前正在实施的答案,是一些额外的属性,这些属性会在X毫秒过去后更新绑定源。最后,我决定使用组合将DelayedBinding实现为MarkupExtension。我唯一的问题是,如果IProvideValueTarget中的TargetProperty为空,则DataTemplatesProvideValue返回此值。[MarkupExtensionReturnType(typeof(object))]publicclassDelayedBindingExtension:MarkupExtension{privatereadonlyBinding_binding=newBinding();publicDelayedBindingExtension(){//延迟的默认值Delay=TimeSpan.FromSeconds(0.5);}publicDelayedBindingExtension(PropertyPathpath):this(){Path=path;}#region属性[DefaultValue(null)]publicobjectAsyncState{get{return_binding.AsyncState;}设置{_binding.AsyncState=值;}}[DefaultValue(false)]publicboolBindsDirectlyToSource{get{return_binding.BindsDirectlyToSource;}设置{_binding.BindsDirectlyToSource=值;}}[DefaultValue(null)]publicIValueConverterConverter{get{return_binding.Converter;}设置{_binding.Converter=值;}}[TypeConverter(typeof(CultureInfoIetfLanguageTagConverter)),DefaultValue(null)]publicCultureInfoConverterCulture{get{return_binding.ConverterCulture;}设置{_binding.ConverterCulture=值;}}[DefaultValue(null)]publicobjectConverterParameter{get{return_binding.ConverterParameter;}设置{_binding.ConverterParameter=值;}}[DefaultValue(null)]publicstringElementName{get{return_binding.ElementName;}设置{_binding.ElementName=值;}}[DefaultValue(null)]publicobjectFallbackValue{get{return_binding.FallbackValue;}设置{_binding.FallbackValue=值;}}[DefaultValue(false)]publicboolIsAsync{get{return_binding.IsAsync;}设置{_binding.IsAsync=值;}}[DefaultValue(BindingMode.Default)]publicBindingModeMode{get{return_binding.Mode;}设置{_binding.Mode=值;}}[DefaultValue(false)]publicboolNotifyOnSourceUpdated{get{return_binding.NotifyOnSourceUpdated;}设置{_binding.NotifyOnSourceUpdated=值;}}[DefaultValue(false)]publicboolNotifyOnTargetUpdated{get{return_binding.NotifyOnTargetUpdated;}设置{_binding.NotifyOnTargetUpdated=值;}}[默认tValue(false)]publicboolNotifyOnValidationError{get{return_binding.NotifyOnValidationError;}设置{_binding.NotifyOnValidationError=值;}}[DefaultValue(null)]publicPropertyPathPath{get{return_binding.Path;}设置{_binding.Path=值;}}[DefaultValue(null)]publicRelativeSourceRelativeSource{get{return_binding.RelativeSource;}设置{_binding.RelativeSource=值;}}[DefaultValue(null)]publicobjectSource{get{return_binding.Source;}设置{_binding.Source=值;}}[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]publicUpdateSourceExceptionFilterCallbackUpdateSourceExceptionFilter{get{return_binding.UpdateSourceExceptionFilter;}设置{_binding.UpdateSourceExceptionFilter=值;}}[DefaultValue(UpdateSourceTrigger.Default)]publicUpdateSourceTriggerUpdateSourceTrigger{get{return_binding.UpdateSourceTrigger;}设置{_binding.UpdateSourceTrigger=值;}}[DefaultValue(null)]publicobjectTargetNullValue{get{return_binding.TargetNullValue;}设置{_binding.TargetNullValue=值;}}[DefaultValue(null)]publicstringStringFormat{get{return_binding.StringFormat;}设置{_binding.StringFormat=值;}}[DefaultValue(false)]publicboolValidatesOnDataErrors{get{return_binding.ValidatesOnDataErrors;}设置{_binding.ValidatesOnDataErrors=值;}}[DefaultValue(false)]publicboolValidatesOnExceptions{get{return_binding.ValidatesOnExceptions;}设置{_binding.ValidatesOnExceptions=值;}}[DefaultValue(null)]publicstringXPath{get{return_binding.XPath;}设置{_binding.XPath=值;}}[DefaultValue(null)]publicCollectionValidationRules{get{return_binding.ValidationRules;}}#endregion[DefaultValue(null)]publicTimeSpanDelay{get;放;}publicoverrideobjectProvideValue(IServiceProviderserviceProvider){try{_binding.Mode=BindingMode。双向;_binding.UpdateSourceTrigger=UpdateSourceTrigger.Explicit;}catch(InvalidOperationException)//Bindinginusealreadydon'tchangeit{}varvalueProvider=serviceProvider.GetService(typeof(IProvideValueTarget))asIProvideValueTarget;if(valueProvider!=null){varbindingTarget=valueProvider.TargetObjectasDependencyObject;varbindingProperty=valueProvider.TargetPropertyasDependencyProperty;if(bindingProperty!=null&&bindingTarget!=null){varresult=(BindingExpression)_binding.ProvideValue(serviceProvider);新的DelayBindingManager(结果,绑定目标,绑定属性,延迟);返回结果;}}返回这个;}privateclassDelayBindingManager{privatereadonlyBindingExpressionBase_bindingExpression;私有只读DependencyProperty_bindingTargetProperty;私有DependencyPropertyDescriptor_descriptor;私有只读DispatcherTimer_timer;publicDelayBindingManager(BindingExpressionBase绑定ingExpression,DependencyObjectbindingTarget,DependencyPropertybindingTargetProperty,TimeSpandelay){_bindingExpression=bindingExpression;_bindingTargetProperty=绑定目标属性;_descriptor=DependencyPropertyDescriptor.FromProperty(_bindingTargetProperty,bindingTarget.GetType());如果(_descriptor!=null)_descriptor.AddValueChanged(bindingTarget,BindingTargetTargetPropertyChanged);_timer=newDispatcherTimer();_timer.Tick+=TimerTick;_timer.Interval=延迟;}privatevoidBindingTargetTargetPropertyChanged(objectsender,EventArgse){varsource=(DependencyObject)sender;if(!BindingOperations.IsDataBound(source,_bindingTargetProperty)){if(_descriptor!=null){_descriptor.RemoveValueChanged(source,BindingTargetTargetPropertyChanged);_描述符=空;}返回;}_timer.Stop();_timer.Start();}privatevoidTimerTick(objectsender,EventArgse){_timer.Stop();_bindingExpression.UpdateSource();}}}直接移植这是不可能的,但我们可以用MultiBinding来“模拟”这个注意,这是一个非常紧密耦合的解决方案,如果在页面上使用许多这样的绑定,则可能无法正常工作......两个必须有......哪个接受延迟(以毫秒为单位)的单个项目ArrayList作为转换器参数每个此类延迟绑定必须携带其自己的转换器参数实例。测试XAML如下...2000在此示例中,TextBlock在2秒延迟后呈现下方TextBox中键入的内容。TextBox.Text是主要的数据源。DelayHelper是多转转换器,其工??作方式如下所示……publicclassDelayHelper:IMultiValueConverter{#regionIMultiValueConverterMemberspublicobjectConvert(object[]values,TypetargetType,objectparameter,System.Globalization.CultureInfoculture){varsourceElement=values[1]作为FrameworkElement;vardp=values[2]作为DependencyProperty;varparamArray=参数作为ArrayList;varexistingValue=paramArray!=null&¶mArray.Count==2?paramArray[1]:sourceElement.GetValue(dp);varnewValue=值[0];varbndExp=BindingOperations.GetMultiBindingExpression(sourceElement,dp);vartemp=newDispatcherTimer(){IsEnabled=false};vardspTimer=newDispatcherTimer(newTimeSpan(0,0,0,0,int.Parse(paramArray[0].ToString())),DispatcherPriority.Background,newEventHandler(delegate{if(bndExp!=null&&existingValue!=newValue){vararray=bndExp.ParentMultiBinding.ConverterParameterasArrayList;varexistingInterval=数组[0];array.Clear();array.Add(existingInterval);array.Add(新值);bndExp.UpdateTarget();}temp.Stop();}),sourceElement.Dispatcher);temp=dspTimer;dspTimer.Start();返回现有值;}publicobject[]ConvertBack(objectvalue,Type[]targetTypes,objectparameter,System.Globalization.CultureInfoculture){thrownewNotImplementedException();}#endregion}所以这段代码利用了MultiBinding可以接受目标UI元素(TextBlock)和它自己的多边界的依赖属性(TextBlock.TextProperty)这一事实。一旦绑定,MultiBinding就无法更改其属性,包括ConveterParameter。但是转换器参数本身可以是一个引用对象,它在整个绑定过程中保持其引用处于活动状态,例如ArrayList。DispatcherTimer必须在第一个Tick之后停止。所以我们使用temp变量是非常有必要的。更新为每个源文本更新生成2个转换器通道。此行为没有escpae。这会导致许多惰性绑定的使用速度变慢。确保你没有在多个延迟绑定中共享相同的转换器参数让我知道这是否有帮助...以上是关于C#学习教程:在.Net4.5中共享.Net4.0的绑定延迟属性,如果有用给你和你需要了解更多的C#学习教程,希望你多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: