首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataBinding到RelativeSource标签

DataBinding到RelativeSource标签
EN

Stack Overflow用户
提问于 2012-04-27 23:44:39
回答 1查看 6.5K关注 0票数 0

我尝试使用Tag属性作为绑定的源,但当它到达转换器时,值为null。

我做错了什么?

消费者

代码语言:javascript
复制
<Button Style="{StaticResource AddNewItemButtonStyle}" Tag="blah" />

绑定

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

更新

我使用相同的策略为ToolTip添加了一个设置器,它确实起作用了,但只有在第二次调用转换器之后(由鼠标悬停触发)。

您能理解为什么绑定在第一次传递时不起作用吗?

除了标签之外,还有什么地方我可以更可靠地使用吗?

第2次更新

根据Phil的输入,我将样式更改为下面的xaml。是否必须将模板属性添加到样式中?

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-28 00:40:10

如果您将我对另一个问题的答案中的xaml更改为

代码语言:javascript
复制
<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的缩写形式

代码语言:javascript
复制
<AccessText Grid.Column="1" VerticalAlignment="Center" Text="{TemplateBinding Tag}"/>

或者是长格式

代码语言:javascript
复制
<AccessText Grid.Column="1" VerticalAlignment="Center" 
    Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Tag}"/>

或者,您的样式将像这样工作(为了测试而删除了一些内容):

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10353707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档