无法将WPF TextBlock绑定到属性
问题描述:
在我的项目中,我有一个自定义控件,它是一个扩展器。按钮的内容会使控件展开或折叠,这取决于状态。我得到了大部分工作,但是我无法将文本绑定到我用于该按钮的内容。无法将WPF TextBlock绑定到属性
这里是我的XAML的代码从Generic.xaml:
<ControlTemplate x:Key="PndExpanderControlVertical" TargetType="{x:Type local:PndExpanderControl}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<dx:DXExpander x:Name="expander" Grid.Column="0" FlowDirection="LeftToRight" VerticalExpand="None" HorizontalExpand="FromLeftToRight" IsExpanded="True">
<dxlc:GroupBox x:Name="group_box" Padding="0" Header="Header"/>
</dx:DXExpander>
<Button Grid.Column="1" Padding="1" x:Name="expand_button">
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<!-- Button-Style, expanded -->
<DataTrigger Binding="{Binding IsExpanded, ElementName=expander}" Value="True">
<Setter Property="Content" Value="↧ ↧"/>
<Setter Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="90"/>
</Setter.Value>
</Setter>
</DataTrigger>
<!-- Button-Style, collapsed -->
<DataTrigger Binding="{Binding IsExpanded, ElementName=expander}" Value="False">
<Setter Property="Content">
<Setter.Value>
<TextBlock>
<TextBlock Text="↥ "/>
<TextBlock Text="{Binding Header, ElementName=group_box}"/>
<TextBlock Text=" ↥"/>
</TextBlock>
</Setter.Value>
</Setter>
<Setter Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="90"/>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>
</Border>
</ControlTemplate>
正如你可以看到我使用嵌套文本块到group_box的头球一些箭头组合。但是,中间文本块的绑定不起作用。
说实话,我现在用WPF工作了一段时间,但是数据绑定(到正确的源码)对我来说仍然是一个谜。大部分时间我都会以某种方式工作,但如果失败了,我不知道该怎么做。我搜索了几个小时,尝试了各种各样的东西,但没有为我工作。
任何帮助表示赞赏。
答
你可以绑定到Expander
的Content
的Header
:
<TextBlock Text="↥ "/>
<TextBlock Text="{Binding Content.Header, ElementName=expander}"/>
<TextBlock Text=" ↥"/>
不能使用ElementName
,因为它不是在同一个名字的范围为Button
直接绑定到GroupBox
。
编辑:
好吧,这只有在扩展默认处于折叠状态的作品。
但是你可以使用一个x:Reference
绑定到GroupBox
:
<TextBlock Text="↥ "/>
<TextBlock Text="{Binding Header, Source={x:Reference group_box}}"/>
<TextBlock Text=" ↥"/>
可惜,这是行不通的。输出说:“System.Windows.Data错误:4:找不到与引用绑定的源'ElementName = expander'。BindingExpression:Path = Content.Header; DataItem = null;目标元素为'TextBlock'(Name ='');目标属性是'文本'(类型'字符串')“ – Takiro
谢谢,这完美的作品。你能解释为什么必须使用x:Reference吗?从我在快速搜索中找到的ElementName和x:Reference的工作基本相同。 MSDN也表示:“对于大多数WPF应用程序和场景,仍应使用ElementName绑定。” – Takiro
有关ElementName和x之间区别的信息,请参阅以下问题:参考:http://stackoverflow.com/questions/19244111/what-is-the-difference-between-xreference-and-elementname – mm8