使用Style setter中的ElementName绑定

时间:2017-01-20 20:05:17

标签: wpf

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

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

<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,显然它不能。有没有办法完成我在这里尝试做的事情并从这个样式设置器中绑定到另一个元素的属性?

1 个答案:

答案 0 :(得分:1)

我不知道为什么这种约束不适合你;也许是因为名称解析视觉树的东西或其他。

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

<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>