【问题标题】:Can't get WPF TextBlock to bind to Property无法让 WPF TextBlock 绑定到属性
【发布时间】:2017-02-23 16:54:37
【问题描述】:

在我的项目中,我有一个自定义控件,它是一个扩展器。使控件展开或折叠的按钮内容应根据状态而变化。我得到了大部分工作,但我无法将文本绑定到我用于按钮的内容。

这是我来自 Generic.xaml 的 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 已经有一段时间了,但是数据绑定(到正确的源)对我来说仍然是一个谜。大多数时候我让它以某种方式工作,但如果它失败了,我不知道该怎么做。我用谷歌搜索了几个小时并尝试了各种方法,但对我没有任何效果。

感谢任何帮助。

【问题讨论】:

    标签: wpf xaml data-binding


    【解决方案1】:

    您可以绑定到HeaderContentExpander

    <TextBlock Text="↥ "/>
    <TextBlock Text="{Binding Content.Header, ElementName=expander}"/>
    <TextBlock Text=" ↥"/>
    

    您不能使用ElementName 直接绑定到GroupBox,因为它与Button 不在同一个名称范围内。

    编辑:

    好的,只有在默认情况下展开器折叠时才有效。

    但您可以使用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='');目标属性是“文本”(类型“字符串”)”
    • 谢谢,这很好用。你能解释为什么必须使用 x:Reference 吗?从我在快速搜索中发现的 ElementName 和 x:Reference 工作基本相同。 MSDN 还说:“对于大多数 WPF 应用程序和场景,仍应使用 ElementName 绑定。”
    • ElementName和x:Reference的区别请参考以下问题:stackoverflow.com/questions/19244111/…
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2011-06-20
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多