DataBinding到RelativeSource标签

时间:2012-04-27 15:44:39

标签: wpf xaml data-binding

我正在尝试使用Tag属性作为Binding的源,但是当它到达转换器时该值为null。

我做错了什么?

消费

<Button Style="{StaticResource AddNewItemButtonStyle}" Tag="blah" />

结合

<Style x:Key="AddNewItemButtonStyle" BasedOn="{StaticResource blueButtonStyle}" 
       TargetType="{x:Type Button}">
    ...             
    <AccessText Text="{Binding RelativeSource={RelativeSource Self}, 
                Path=Tag, Converter={StaticResource AddNewItemForLabel}}">
</Style>

更新

我使用相同的策略为ToolTip添加了一个setter,并且只有在第二次调用转换器之后才能工作(由鼠标悬停触发)。

你能看出为什么绑定在第一次通过时不会起作用吗?

除标签之外还有其他地方我可以更可靠地使用吗?

第二次更新

根据Phil的输入,我将我的风格改为下面的xaml。我必须在样式中添加Template属性吗?

<Style x:Key="AddNewItemButtonStyle" BasedOn="{StaticResource blueButtonStyle}" TargetType="{x:Type Button}">
    <Setter Property="resx:ResxExtension.DefaultResxName" Value="Smack.Core.Presentation.Resources.MasterDetail"/>
    <Setter Property="Content" >
        <Setter.Value>
            <StackPanel Orientation="Horizontal">
                <Image Source="{resx:Resx ResxName=Smack.Core.Presentation.Resources.MasterDetail, Key=bullet_add}" Stretch="Uniform" />
                <AccessText VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag, Converter={StaticResource AddNewItemForLabel}}" />
                <ContentPresenter/>
            </StackPanel>
        </Setter.Value>
    </Setter>
    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag, Converter={StaticResource AddNewItemForToolTip}}"/>
    <Setter Property="Command" Value="{Binding AddNewItemCommand}" />
</Style>

1 个答案:

答案 0 :(得分:0)

如果您在答案中更改了xaml,我将其他问题改为

<AccessText Grid.Column="1" VerticalAlignment="Center">
    <AccessText.Text>
        <MultiBinding StringFormat="{}_{0} {1}">
            <Binding Source="{StaticResource Test}"/>
            <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Tag"/>
        </MultiBinding>
    </AccessText.Text>
</AccessText>

然后Tag就可以了。

或者您可以使用TemplateBinding的简短形式

<AccessText Grid.Column="1" VerticalAlignment="Center" Text="{TemplateBinding Tag}"/>

或长篇

<AccessText Grid.Column="1" VerticalAlignment="Center" 
    Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Tag}"/>

或者,您的样式将像这样工作(删除位以进行测试):

<Style x:Key="AddNewItemButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Content" >
        <Setter.Value>
            <StackPanel Orientation="Horizontal">
                <AccessText VerticalAlignment="Center" 
                            Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=Tag}" />
                <ContentPresenter/>
            </StackPanel>
        </Setter.Value>
    </Setter>
    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}"/>
</Style>