将附加属性绑定到控件模板内的附加属性

时间:2019-06-17 17:01:24

标签: c# xaml uwp uwp-xaml

以下是我的问题的有效示例: https://github.com/themimcompany/AttachedPropertyIssue

我有一个Style的{​​{1}}定义了一个Button。在ControlTemplate内,我有一个ControlTemplate,它具有相同的附加属性。我想将TextBlock的附加属性设置/绑定到TextBlock的附加属性的值。附加属性是一个简单的Button值。

如何使它正常工作?在UWP中可以这样做吗?我收到的错误并未给我指示如何解决。像int ...

这是我的风格:

Unspecified error

这是我所附的属性定义:

<Style TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid>
                        <TextBlock local:Translation.TranslationModelID="{Binding Path=(local:Translation.TranslationModelID),
                                                                                         RelativeSource={RelativeSource TemplatedParent}}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
</Style>

这是我要定义的按钮,请注意,我想分配按钮的附加属性,然后在ControlTemplate中获取值并将其分配给TextBlock的附加属性(看一下样式):

public class Translation
{
    public static int GetTranslationModelID(DependencyObject obj)
    {
        return (int)obj.GetValue(TranslationModelIDProperty);
    }

    public static void SetTranslationModelID(DependencyObject obj, int value)
    {
        obj.SetValue(TranslationModelIDProperty, value);
    }

    public static readonly DependencyProperty TranslationModelIDProperty =
        DependencyProperty.RegisterAttached("TranslationModelID", typeof(int), typeof(FrameworkElement), new PropertyMetadata(0));

}

再次说明:我有一个分配给<Button local:Translation.TranslationModelID="1" /> 的附加属性,我想将该Button的附加属性的值分配给相同的附加属性Button的{​​{1}}的{​​{1}}中TextBlock的属性。它没有按我预期的那样工作。我在运行时遇到ControlTemplate异常。我该如何工作?

以下是我的问题的有效示例: https://github.com/themimcompany/AttachedPropertyIssue

编辑:

这种方法给我一个不同的错误。 Button

Style

1 个答案:

答案 0 :(得分:0)

  

我想使用TemplateBinding或常规绑定将模板化父级的附加属性分配给ControlTemplate内部元素的附加属性

根据您的要求,您可以创建继承按钮的模板控件。然后在后面的代码中设置TextBlock Attached属性。请检查以下细分代码。

date

Xaml

public sealed class CustomButton : Button, IDisposable
{
    private long token;
    private TextBlock Tbk;

    public CustomButton()
    {
        this.DefaultStyleKey = typeof(CustomButton);
    }

    private void CallBackMethod(DependencyObject sender, DependencyProperty dp)
    {
        UpdateAttachedPropertyValue();
    }

    protected override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        token = this.RegisterPropertyChangedCallback(AttachedPropertyTest.Translation.TranslationModelIDProperty, CallBackMethod);
        Tbk = GetTemplateChild("TBK") as TextBlock;
        UpdateAttachedPropertyValue();        
    }

    public void Dispose()
    {
        this.UnregisterPropertyChangedCallback(AttachedPropertyTest.Translation.TranslationModelIDProperty,token);
    }

    private void UpdateAttachedPropertyValue()
    {
        AttachedPropertyTest.Translation.SetTranslationModelID(Tbk, AttachedPropertyTest.Translation.GetTranslationModelID(this));
    }

}