秦皇岛网络公司 网站托管,创建网站 优帮云,做网络推广怎么收费,做动画视频的网站引言
xaml代码中属性的绑定主要是通过元素名或类型进行查找绑定和解析的#xff0c;但是当在后台生成控件或面对popup、menuitem时#xff0c;发现他们都查找不到这时为什么呢#xff1f;
局限性
1、无法绑定后台生成控件
xaml中声明的元素会自动被添加进可视化树中但是当在后台生成控件或面对popup、menuitem时发现他们都查找不到这时为什么呢
局限性
1、无法绑定后台生成控件
xaml中声明的元素会自动被添加进可视化树中但后台通过代码添加的控件无法被xaml代码绑定如下
//后台
TextBox tb new TextBox(tb);//xaml
TextBlock Text{Binding ElementNametb,PathText}/
这样是绑定不成功的我们需要注册 tb 这个名称可以临时解决这个问题但RelativeSource绑定时仍然找不到。
//后台
TextBox tb new TextBox(tb);
this.RegisterName(tb.Name,tb);//xaml
TextBlock Text{Binding ElementNametb,PathText}/ 对于RelativeSource可以通过x:Reference 解决
TextBlock Text{Binding Source{x:Reference Nametb,PathText}/ 但仍然有问题如果我们用x:Reference 将 控件的Tag绑定到自身 会出现循环依赖错误。因为Tag依赖 Button而Button此时还没有构建完成。
Button Name tb Content Click meButton.TagItemsControlTextBlock Text {Binding Source{x:Reference Nametb},PathContent}//ItemsControl/Button.Tag
/Button
2、控件Tag、DataGridTextColumn元素无法绑定
因为Tag不存在于可视化树中所以也无法绑定。用x:Reference 可以解决绑定非自身属性但通常我们都要绑定父类的DataContext.
3、ContextMenu、Tooltip
都在Popup可视化树上也无法绑定父类控件属性。但他们有个PlacementTarget代表父类对象 后台可以通过 ContextMenuService.GetPlacementTarget(dp) 获取dp的父控件前端则没有办法。
注意他们是可以继承DataContext可以绑定ViewModel的属性。
万能解决方案
BindingProxy
很简单的一个类主要是继承了 Freezable。
public class BindingProxy : Freezable
{protected override Freezable CreateInstanceCore() new BindingProxy();public object Data{get { return (object)GetValue(DataProperty); }set { SetValue(DataProperty, value); }}public static readonly DependencyProperty DataProperty DependencyProperty.Register(Data, typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}
可以添加到资源里面使用
Window.Resourceslocal:BindingProxy k:KeymyButton Data{Binding ElementNametb}/
/Window.Resource
Button Name tb Content Click meButton.TagItemsControlTextBlock Text {Binding Source{StaticResource myButton},PathData.Content}//ItemsControl/Button.Tag
/Button 也可以直接添加到Button资源里使用
Button Name tb Content Click meButton.Resourceslocal:BindingProxy k:KeymyButton Data{Binding ElementNametb}//Button.ResourceButton.TagItemsControlTextBlock Text {Binding Source{StaticResource myButton},PathData.Content}//ItemsControl/Button.Tag
/Button
只要父子关系成立就可以绑定写在何处都无所谓。
同样也有一个继承了Freezable类的现有元素DiscreteObjectKeyFrame它通常用在动画上面没有BindingProxy轻量。