使用TemplateBinding更新源

9
我使用这种样式来制作所有的标签。
    <Style TargetType="Label" x:Key="LabelStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Label">
                    <StackPanel Orientation="Horizontal"  >
                        <TextBox Loaded="MyTextBlock_Loaded" x:Name="EditControl" Visibility="Collapsed" Text="{TemplateBinding Tag}" />
                        <Label Content="{TemplateBinding Content}" Grid.Column="1" Grid.Row="1">
                        </Label>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

以及我的示例标签

<Label Grid.Column="0" Grid.Row="0" Content="Photo" Style="{StaticResource LabelStyle}" Tag="{Binding fieldsCode.firstName, UpdateSourceTrigger=PropertyChanged}"/>

但是我认为TemplateBinding不支持属性的更新。如何解决这个问题?

2个回答

28

尝试使用这个方法进行双向绑定

Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag, Mode=TwoWay}"

Veer,标签的Tag属性是否不支持数据更改? - Polaris
@Polaris:刚才看到你在Label的Tag中使用了UpdateSourceTrigger,这是不必要的。如果确实需要,它应该在目标即Textbox中使用,因为它用于将目标的更改传播到源。默认情况下,在双向绑定(请查看我的编辑)中,当目标(文本框)失去焦点时,目标的更改将被传播到源。如果您真的希望更改在文本更改时传播,则应将updatesourcetrigger添加到文本框中。 - Amsakanna
@Veer,它不起作用。你能在VS中检查一下这个解决方案吗?再次进行单向绑定。 - Polaris
能否将BindingExpression发送到ControlTemplate?如果我直接将TextBlock绑定到我的类属性,一切都会正常工作,但是我绑定到Tag属性:( - Polaris
@Polaris:我现在没有VS。你能发一下你最近的版本吗? - Amsakanna
显示剩余5条评论

1
如果您想从ControlTemplate内部到其模板化父级的属性进行单向绑定,请使用{TemplateBinding}。对于所有其他情况,请改用{Binding}: <TextBox Loaded="MyTextBlock_Loaded" x:Name="EditControl" Visibility="Collapsed" Text="{Binding Tag, Mode=TwoWay}" />

{绑定标签,相对源={相对源模板父级}, 模式=双向}。 - Stephen Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接