我的程序里有一个ControlTemplate里边是两个自定义的控件并且它们都有Text属性,我想将他们两个的Text属性进行绑定,达到其中一个text属性改变另一个也会随着改变的目的,可是用Binding方法却无法绑定,结果是空有哪位大神知道该怎么做呀?
<ControlTemplate>
<Grid>
<c:RelativePositionPanel Margin="-4">
<c:IDLabel x:Name="Arrow" Text="dede" c:RelativePositionPanel.RelativePosition="0.5,1.5"/>
</c:RelativePositionPanel>
<c:Arrow Text="{Binding ElementName=Arrow,Path=Text}"/>
</Grid>
</ControlTemplate>
用Snoop看一看,看一下c:RelativePositionPanel中的c:IDLabel是怎样构建的可视化树,有可能c:IDLabel被类似Children或Items属性包含,RelativePositionPanel的基类可能是ItemsControl或Canvas。ElementName 是在运行时通过查找可视化树或逻辑树来确定名称边界,在集合中的子元素是绑定不上的。你可以试试x:Reference。
可以绑定了,真的是太感谢了。不过我还有一个问题想请教一下,就是我在做一个动态添加的模板,最外层是DesignerItem模板继承的是DesignerItem : ContentControl, ISelectable, IGroupable用来记录一些信息 ,然后又给它添加了一个附加属性 DragThumb ,它继承的是Thumb用来实现拖动功能的,我又在 DragThumb 添加了一个控件这个控件可以用来接收text,我现在想让这个text属性和最外边的DesignerItem的text属性绑定可是却没办法绑定,怀疑是DragThumb这个属性阻碍了他们之间数据的传递,因为我不把这个控件放到DragThumb里就可以绑定但是这样的话就没法移动了,您知道是什么原因吗?
或者说以帖子的问题为前提,有没有办法让它绑定到它的父元素的属性里呢?我不是专业的程序员做这个软件是领导交给的任务,只有我一个人在做,真是麻烦您了
@wei霄:
ControlTemplate内部的控件绑定父级控件:
Width="{Binding RelativeSource={RelativeSource AncestorType=Grid, Mode=FindAncestor},Path=ActualWidth}"
ControlTemplate内部的控件绑定ControlTemplate外部父级控件:
Width="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=ActualWidth}"
这是普通的绑定方式,你应该清楚。
关于 DragThumb 影响绑定,需要拿到具体代码才能分析。
@楚人Leo: 我再研究研究,谢谢您
@wei霄: 不客气,找到原因了分享一下
@楚人Leo: 好的,实在抱歉具体代码不能发给您
按理说这样可以绑定成功的,是不是RelativePositionPanel这个控件有些问题
我试着把RelativePositionPanel这个控件去掉了,但是还是不行。而且把我自定义的控件单独拿出来在ControlTemplate外边进行绑定就可以
@wei霄: 这是我测试的代码,看起来可行
<Label>
<Label.Template>
<ControlTemplate>
<StackPanel>
<TextBlock Name="t1" Text="abcd" />
<TextBlock Text="{Binding ElementName=t1, Path=Text}" />
</StackPanel>
</ControlTemplate>
</Label.Template>
</Label>
我试了试您发的这个确实可以绑定,但是放到我的模板里就不行了。可能是我的模板有问题。我的控件是放到了一个可拖拽的模板里的
<local:DesignerItem.DragThumbTemplate >
<ControlTemplate>
<Grid>
<c:RelativePositionPanel Margin="-4">
<c:IDLabel x:Name="Arrow" Text="dede" c:RelativePositionPanel.RelativePosition="0.5,1.5"/>
</c:RelativePositionPanel>
<c:Arrow Text="{Binding ElementName=Arrow,Path=Text}"/>
</Grid>
</ControlTemplate>
</local:DesignerItem.DragThumbTemplate>
元素不在逻辑树里,试一下Source语法
也试过了,还是有问题