【问题标题】:Bind value of controlTemplate to other instance in XAML将 controlTemplate 的值绑定到 XAML 中的其他实例
【发布时间】:2015-10-14 02:51:13
【问题描述】:

我是 WPF 的新手,所以我对“绑定”之类的东西有点迷失。

我刚刚创建了一个自定义扩展器的 controlTemplate,这是我的代码:

<Style TargetType="{x:Type ToggleButton}">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="{x:Type ToggleButton}">
                                            <Border Padding="{TemplateBinding Padding}">
                                                <Grid SnapsToDevicePixels="False">
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition Width="*"/>
                                                        <ColumnDefinition Width="6*"/>
                                                    </Grid.ColumnDefinitions>
                                                    <Border Grid.ColumnSpan="2" Name="bgHack" Background="#FFFFC000" />
                                                    <Image Grid.ColumnSpan="2" HorizontalAlignment="Center" Name="imageArrow" Source="Images/downRow.png" Stretch="None"/>
                                                    <Viewbox Grid.Column="0" Stretch="Uniform" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                                        <!--HERE IS THE VALUE OF THE TEXT I WANT TO CHANGE IN EACH INSTANCE-->
                                                        <TextBlock Name="headerText" Foreground="White" FontFamily="/BundyPOS;component/Fonts/#HelveticaRounded" TextAlignment="Center" Margin="7">Artículos</TextBlock>
                                                    </Viewbox>
                                                    <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="1" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Left" Margin="4,0,0,0" RecognizesAccessKey="True" SnapsToDevicePixels="True" VerticalAlignment="Center"/>
                                                </Grid>
                                            </Border>
                                            <ControlTemplate.Triggers>
                                                <Trigger Property="IsChecked" Value="True"><!--WHEN CLICK IS RELEASED-->
                                                    <Setter Property="Source" TargetName="imageArrow" Value="Images/upRow.png"/>
                                                </Trigger>
                                                <Trigger Property="IsMouseOver" Value="True">
                                                    <Setter Property="Background" TargetName="bgHack" Value="#3cb878"/>
                                                </Trigger>
                                            </ControlTemplate.Triggers>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>

我也可以像这样实例化这个 controlTemplate:

<Expander Name="articlesExpander" Template="{StaticResource ExpanderHeaderImage}">
                        <StackPanel>
                                <TextBox>This is a textbox</TextBox>
                                <Button>A button</Button>
                            </StackPanel>
                     </Expander>

如何更改位于 controlTemplate 的 TextBlock 的文本值?我的意思是,我要创建这个 controlTemplate 的几个实例,并且我需要更改每个实例中 TextBlock 的文本。

【问题讨论】:

  • ControlTemplate 目标 ToggleButton,第二个 XAML sn-p 不涉及。不明白你的意思。如果您的意思是要设置Expander 的切换按钮的样式,那么这不是要走的路。您不能从外部设置样式,而是在 Expander 内部设置样式(通常需要复制的 Expander 模板)。
  • @King King 我没有放所有代码,因为它太多了,但是客户扩展器已经工作了,我只需要在第二个 XAML sn-p 中更改 TextBlock 的文本跨度>
  • 不确定它有多少,但第二个 sn-p 看起来根本不涉及第一个。顺便说一句,您在 ControlTemplate 中对 TextBlock 的 Text 进行了硬编码,因此我们无法在 XAML 中的其他地方更改它。即使在代码中,您也需要执行一些遍历可视化树来查找 TextBlock 并更改 Text。如果希望它是动态的,则需要松散地设置文本(例如对某些 Binding、DynamicResource 等)
  • @FernandoSantiago 将 TextBlock 数据绑定到模板化父级可能会对您有所帮助。看看这个SO

标签: c# wpf data-binding binding


【解决方案1】:

在您的模板中更改以下代码:

<TextBlock Name="headerText" Foreground="White" 
           FontFamily="/BundyPOS;component/Fonts/#HelveticaRounded" 
           TextAlignment="Center" Margin="7">Artículos</TextBlock>

到这里:

<TextBlock Name="headerText" Foreground="White" 
           FontFamily="/BundyPOS;component/Fonts/#HelveticaRounded" 
           TextAlignment="Center" Margin="7" 
           Text="{TemplateBinding Tag}" />

在 Expander 的 ControlTemplate 中,找到 ToggleButton 并将以下内容添加到该标记:

<ToggleButton ... Tag="{TemplateBinding Tag}" />

这是一种将一小段信息沿链传递的简单方法。现在您可以更改甚至将 Expander 的 Tag 属性绑定到任何文本,它将显示在您的 TextBlock 中。以下是它如何与您的第二段代码一起工作:

<Expander Name="articlesExpander" 
          Template="{StaticResource ExpanderHeaderImage}" 
          Tag="Artículos">
          ...
</Expander>

【讨论】:

  • 我按照你告诉我的所有内容都进行了更改,但没有奏效。 ... 扩展器:
  • 我会尽快发布一个完整的代码示例供您使用。
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2015-04-10
相关资源
最近更新 更多