标签 Wpf 下的文章

wpf获取某一属性的绑定信息

背景

WPF开发时,常常会将一些属性进行数据绑定,如某一控件A的宽高属性。然而,有些操作可能会覆盖掉该绑定,如全屏操作,基于一些原因,该操作需要手动修改控件宽高,这时,控件的绑定属性将失效,在取消全屏时,如不做处理,控件A的宽高将无法正常设置。

解决方案

全屏时,在需要手动设置控件A的宽高属性之前,手动保存宽高的绑定信息。

mb_height_multi = BindingOperations.GetMultiBindingExpression((_textbox as TextBox), EmbryologySlide.HeightProperty);

在取消全屏时,重新将宽高属性设置回绑定。

_textbox.SetBinding(TextBox.HeightProperty, mb_height_multi.ParentMultiBinding);

以上是以多条件绑定为例,如是单条件绑定,如下:

mb_height = BindingOperations.GetBindingExpression((_textbox as TextBox), EmbryologySlide.HeightProperty);
。。。
_textbox.SetBinding(TextBox.HeightProperty, mb_height?.ParentBinding);

其他操作

  • 获取Binding/MultiBinding

    MultiBindingExpression mbe = BindingOperations.GetMultiBindingExpression((child as TextBox), TextBox.TextProperty);
  • 拿到其中每个Binding的Path

    Binding bd = mbe.ParentMultiBinding.Bindings[0] as Binding;
    bindingPath = bd.Path.Path;
  • 拿到其中的ValidationRule

    ValidationRule vr = mbe.ParentMultiBinding.ValidationRules[0];
  • 更新MultiBinding

    mbe.UpdateSource();

总结

当然,大部分情况下,只要设计合理,类似全屏之类的操作,是不需要修改类似宽高之类的属性信息的。但一些特殊情况,如对自定义控件全屏,且全屏时,需要将控件移动至新窗体实现。此时若自定义控件高度绑定在了原窗体的数据或控件属性上。就需要用到本文方案了。