首页 新闻 搜索 专区 学院

WPF中ControlTemplate内控件间数据绑定

0
悬赏园豆:50 [已解决问题] 解决于 2021-06-08 10:09

我的程序里有一个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>
wei霄的主页 wei霄 | 初学一级 | 园豆:157
提问于:2021-05-27 16:54
< >
分享
最佳答案
0

用Snoop看一看,看一下c:RelativePositionPanel中的c:IDLabel是怎样构建的可视化树,有可能c:IDLabel被类似Children或Items属性包含,RelativePositionPanel的基类可能是ItemsControl或Canvas。ElementName 是在运行时通过查找可视化树或逻辑树来确定名称边界,在集合中的子元素是绑定不上的。你可以试试x:Reference。

收获园豆:50
楚人Leo | 小虾三级 |园豆:803 | 2021-06-03 11:13

可以绑定了,真的是太感谢了。不过我还有一个问题想请教一下,就是我在做一个动态添加的模板,最外层是DesignerItem模板继承的是DesignerItem : ContentControl, ISelectable, IGroupable用来记录一些信息 ,然后又给它添加了一个附加属性 DragThumb ,它继承的是Thumb用来实现拖动功能的,我又在 DragThumb 添加了一个控件这个控件可以用来接收text,我现在想让这个text属性和最外边的DesignerItem的text属性绑定可是却没办法绑定,怀疑是DragThumb这个属性阻碍了他们之间数据的传递,因为我不把这个控件放到DragThumb里就可以绑定但是这样的话就没法移动了,您知道是什么原因吗?

wei霄 | 园豆:157 (初学一级) | 2021-06-04 11:18

或者说以帖子的问题为前提,有没有办法让它绑定到它的父元素的属性里呢?我不是专业的程序员做这个软件是领导交给的任务,只有我一个人在做,真是麻烦您了

wei霄 | 园豆:157 (初学一级) | 2021-06-04 11:28

@wei霄:
ControlTemplate内部的控件绑定父级控件:

Width="{Binding RelativeSource={RelativeSource AncestorType=Grid, Mode=FindAncestor},Path=ActualWidth}"

ControlTemplate内部的控件绑定ControlTemplate外部父级控件:

 Width="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=ActualWidth}"

这是普通的绑定方式,你应该清楚。

关于 DragThumb 影响绑定,需要拿到具体代码才能分析。

楚人Leo | 园豆:803 (小虾三级) | 2021-06-04 11:47

@楚人Leo: 我再研究研究,谢谢您

wei霄 | 园豆:157 (初学一级) | 2021-06-08 10:08

@wei霄: 不客气,找到原因了分享一下

楚人Leo | 园豆:803 (小虾三级) | 2021-06-08 10:13

@楚人Leo: 好的,实在抱歉具体代码不能发给您

wei霄 | 园豆:157 (初学一级) | 2021-06-08 10:14
其他回答(2)
0

按理说这样可以绑定成功的,是不是RelativePositionPanel这个控件有些问题

拓拓 | 园豆:1043 (小虾三级) | 2021-05-27 22:41

我试着把RelativePositionPanel这个控件去掉了,但是还是不行。而且把我自定义的控件单独拿出来在ControlTemplate外边进行绑定就可以

支持(0) 反对(0) wei霄 | 园豆:157 (初学一级) | 2021-05-28 10:05

@wei霄: 这是我测试的代码,看起来可行

        <Label>
            <Label.Template>
                <ControlTemplate>
                    <StackPanel>
                        <TextBlock Name="t1" Text="abcd" />
                        <TextBlock Text="{Binding ElementName=t1, Path=Text}" />
                    </StackPanel>
                </ControlTemplate>
            </Label.Template>
        </Label>
支持(0) 反对(0) 拓拓 | 园豆:1043 (小虾三级) | 2021-05-28 10:13

我试了试您发的这个确实可以绑定,但是放到我的模板里就不行了。可能是我的模板有问题。我的控件是放到了一个可拖拽的模板里的

                <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>
支持(0) 反对(0) wei霄 | 园豆:157 (初学一级) | 2021-05-28 10:24
0

元素不在逻辑树里,试一下Source语法

NeedStudy | 园豆:194 (初学一级) | 2021-05-28 10:18

也试过了,还是有问题

支持(0) 反对(0) wei霄 | 园豆:157 (初学一级) | 2021-05-28 10:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册