如何将DataTemplate 中的控件绑定到父级的一个属性上去?

tylike 2011-03-16 03:02:53

<Intersoft:UXWindow
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:Intersoft="http://intersoft.clientui.com/schemas"
x:Class="InfoWorld.InfoWindow"
Header="InfoWindow"
d:DesignWidth="640" d:DesignHeight="480" Background="Transparent" ResizeGripVisibility="Visible"
x:Name="wndx"
>
<Intersoft:UXWindow.CommandBarTemplate>
<DataTemplate x:Name="tmp">
<Button Height="25" Content="这里如何将内容绑定到wndx(类型是UXWindow)的ProgressBarValue上去?"></Button>
</DataTemplate>
</Intersoft:UXWindow.CommandBarTemplate>
<!--<Intersoft:UXWindow.HeaderTemplate>
<DataTemplate>
<Button>hello,world</Button>
</DataTemplate>
</Intersoft:UXWindow.HeaderTemplate>
<Intersoft:UXWindow.SecondaryToolBarTemplate>
<DataTemplate>
<Button>toolbar2</Button>
</DataTemplate>
</Intersoft:UXWindow.SecondaryToolBarTemplate>-->

<Grid x:Name="LayoutRoot" />
</Intersoft:UXWindow>

后台代码

public partial class InfoWindow : UXWindow{
public static DependencyProperty ProgressBarValueProperty = DependencyProperty.Register("ProgressBarValue", typeof(int), typeof(InfoWindow), null);

public int ProgressBarValue
{
get
{
return (int)GetValue(ProgressBarValueProperty);
}
set
{
SetValue(ProgressBarValueProperty, value);
}
}
}
...全文
269 点赞 收藏 13
写回复
13 条回复
tylike 2011年03月18日
[Quote=引用 12 楼 ywx_xin 的回复:]
我已经试过了,可以工作啊,不明白楼主为什么不可以
<Button Content="{Binding ElementName=win,Path=ProgressBarValue}"/>
[/Quote]
这种情况是可以的,我的问题是,Button是一个根级的控件吗?
一楼的代码内容,是一个文件的内容,不是一个片段。
打开这个文件,就是全部的内容。。。。
<根元素 Name="xxx" ProgressBarValue="xxx"> //这里的属性是在cs代码中声明出来的。
<根元素.模板>
<button content="{Binding ElementName=xxx,Path=ProgressBarValue}">
</根元素.模板>
</根元素>
回复 点赞
ywx_xin 2011年03月18日
我已经试过了,可以工作啊,不明白楼主为什么不可以
<Button Content="{Binding ElementName=win,Path=ProgressBarValue}"/>
回复 点赞
tylike 2011年03月17日
感谢楼上回复。
{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UXWindow}}, Path=ProgressBarValue}
我试过了,我开发的是silverlight程序,在VS2010中AncestorType={x:Type UXWindow}},这里报错,无法编译通过,是因为silverlight中不支持这个吧。
我在PropertyGrid中也看了一下,Mode没有FindAncestor这个选项。
回复 点赞
kael_thas 2011年03月17日
试试
{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UXWindow}}, Path=ProgressBarValue} 
回复 点赞
tylike 2011年03月17日

我试过了,不是因为int型的问题,我改成了string型,依然不显示。
[Quote=引用 10 楼 ywx_xin 的回复:]
可以这样试一下,仍然给Button的Content 设置binding,然后使用一个valueconverter,也许是因为你的ProgressBarValue存放的是int类型,再binding给content的时候没有自动执行ToString()的转换。
[/Quote]
原因是:ProgressBarValue是InfoWindow的属性,InfoWindow是当前类,如果在InfoWindow中再新建一个元素,然后将这个元素的值绑定到Button的Content上去,就可以显示,但这样我必须建一个多余的元素。
回复 点赞
ywx_xin 2011年03月17日
可以这样试一下,仍然给Button的Content 设置binding,然后使用一个valueconverter,也许是因为你的ProgressBarValue存放的是int类型,再binding给content的时候没有自动执行ToString()的转换。
回复 点赞
tylike 2011年03月17日
<Grid>
<TextBlock Name="tst" Text="Test"></TextBlock>
<Button>
<ContentControl>
<TextBlock Text="{Binding ElementName=tst,Path=Text}"></TextBlock>
</ContentControl>
</Button>
</Grid>

我试了上面的方法居然是可以的。
但我的例子就不行了,如果非要强行加一个中转的上去,就比较难看了。。。
[Quote=引用 7 楼 ywx_xin 的回复:]
首先,借用一段介绍说一下在Silverlight中Binding的RelativeSource是怎么工作的:
<Binding RelativeSource="{RelativeSource TemplatedParent}"/>
-or-
<Binding RelativeSource="{RelativeSource Self}"/>

{RelativeSource Templat……
[/Quote]
回复 点赞
tylike 2011年03月17日
感谢楼上回复。
我试了你描述的方法,这次VS2010可以编译通过,并且,也可以运行程序,只是Button上面没有显示按的值,我检查过,肯定对ProgressBarValue进行附值了。另外,我怀疑是Mode没有设置成双向的问题,试过之后还没有效果。
回复 点赞
ywx_xin 2011年03月17日
首先,借用一段介绍说一下在Silverlight中Binding的RelativeSource是怎么工作的:
<Binding RelativeSource="{RelativeSource TemplatedParent}"/>
-or-
<Binding RelativeSource="{RelativeSource Self}"/>

{RelativeSource TemplatedParent}
在其中应用 ControlTemplate 的控件是此绑定的源。这一点可用来在模板级别应用绑定中的验证错误信息。

{RelativeSource Self}
目标元素应用作此绑定的源。当要将元素的一个属性绑定到同一元素的另一个属性时,上述这点很有用。

这也就是说在Silverlight中,不能像在WPF中使用RelativeSource的AncestorType。

然后呢,告诉楼主你的问题可以这么解决:
Content="{Binding ElementName=wndx(你要绑定到的窗体的名字), Path=ProgressBarValue(你要绑定到的属性)}"

回复 点赞
tylike 2011年03月16日
感谢楼上回复。
我不小心装了silverlight升级版,结果搞了一下午,才还原回老版本。
你说人方法去试了,不行,VisualTreeHelper.GetChildCount(this.tmp.LoadContent())结果为零。
还请继续赐教。
最好是用绑定的方试,事实上,我是要把button换成progressbar,将来,在创建window时,就给这个进度条附值.
回复 点赞
a184485789 2011年03月16日

Button btn = (Button)VisualTreeHelper.GetChild(this.tmp.LoadContent(), 0);

这样呢
回复 点赞
tylike 2011年03月16日
感谢楼上回复。
可能是我说的不够明确,我是想在外面调用时这样:

InfoWindow window = ...
window.ProgressBarValue = 29;//结果,就把DataTemplate中的按钮的Content值设置成了29.

回复 点赞
a184485789 2011年03月16日

UXWindow parent = FindParent<UXWindow>(this);
parent.ProgressBarValue = button.Content;

回复 点赞
发动态
发帖子
WPF/Silverlight
创建于2007-09-28

8160

社区成员

1.1w+

社区内容

WPF/Silverlight相关讨论
社区公告
暂无公告