【问题标题】:Binding with ElementName in Style setter在样式设置器中与 ElementName 绑定
【发布时间】:2017-01-20 20:05:16
【问题描述】:

我有一个包含 ControlTemplate 的 Button 基本样式,然后我想创建一些样式,这些样式只为常用的内容设置内容,如“确定”、“取消”等。

在这些样式中,我有一个图像后跟一些文本,我想将图像的高度绑定到文本的高度,所以我有以下内容:

<Style x:Key="OkayButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource RoundedButtonStyle}">
    <Setter Property="Content">
        <Setter.Value>
            <Grid HorizontalAlignment="Center">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>

                <Image Grid.Column="0" Source="{DynamicResource OkayIcon}" Height="{Binding ActualHeight, ElementName=ButtonText}"/>
                <TextBlock x:Name="ButtonText" Grid.Column="1" Margin="5,0,0,0" Text="Okay"/>
            </Grid>
        </Setter.Value>
    </Setter>
</Style>

这样做会给我错误:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=ButtonText'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'Image' (Name=''); target property is 'Height' (type 'Double')

我猜它试图在 ControlTemplate 中找到它显然无法找到的 ButtonText。有没有办法完成我在这里尝试做的事情并从这个样式设置器中绑定到另一个元素的属性?

【问题讨论】:

  • 不确定,但是一旦您开始工作,您将遇到第二个问题:该网格只有一个实例。如果您有多个 OkayButtons,则只有最后创建的一个会获得内容。要解决此问题,内容必须是具有自己的密钥的单独资源,具有 x:Shared="False" 属性。
  • 我希望它可以工作,很奇怪。您是否尝试过使用类似的绑定:“{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=Children[1].ActualHeight}”以防万一

标签: wpf


【解决方案1】:

我不知道为什么那个绑定不适合你;也许是因为名称解析视觉树之类的东西。

但这对我有用,也解决了我在 cmets 中提到的共享资源问题。

<DataTemplate x:Key="ButtonContent" >
    <Grid HorizontalAlignment="Center">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>

        <Image 
            Grid.Column="0" 
            Source="{DynamicResource OkayIcon}" 
            Height="{Binding ActualHeight, ElementName=ButtonText}"
            />

        <TextBlock 
            x:Name="ButtonText" 
            Grid.Column="1" 
            Margin="5,0,0,0" 
            Text="Okay" 
            FontSize="32"
            />
    </Grid>
</DataTemplate>

<Style 
    x:Key="OkayButtonStyle" 
    TargetType="{x:Type Button}" 
    BasedOn="{StaticResource RoundedButtonStyle}"
    >
    <Setter Property="ContentTemplate" Value="{StaticResource ButtonContent}" />
</Style>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2012-07-14
    • 1970-01-01
    • 2017-01-30
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多