Привязка вложенного свойства к присоединенному свойству внутри шаблона элемента управления - PullRequest
0 голосов
/ 17 июня 2019

Вот рабочий пример моей проблемы: https://github.com/themimcompany/AttachedPropertyIssue

У меня есть Style для Button, который определяет ControlTemplate. Внутри ControlTemplate у меня есть TextBlock с таким же вложенным свойством. Я хочу установить / связать свойство присоединенного TextBlock со значением присоединенного свойства Button. Прикрепленное свойство является простым int значением.

Как мне заставить это работать? Можно ли это сделать в UWP? Я получаю ошибки, которые не дают мне указаний о том, как это исправить. Как 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>

Вот мое определение прикрепленного свойства:

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

}

Вот кнопка, которую я пытаюсь определить, обратите внимание, что я хочу назначить прикрепленное свойство кнопки - затем возьмите значение в ControlTemplate и присвойте его свойству присоединенного свойства TextBlock (посмотрите на стиль):

<Button local:Translation.TranslationModelID="1" />

Объяснение еще раз: У меня есть прикрепленное свойство, назначенное для Button, и я хотел бы присвоить значение присоединенного свойства этого Button к тому же присоединенному свойству TextBlock в ControlTemplate этого Button Style. Это не работает, как я ожидаю. Я получаю Unspecified error.. исключение во время выполнения. Как мне заставить это работать?

Вот рабочий пример моей проблемы: https://github.com/themimcompany/AttachedPropertyIssue

EDIT:

Этот подход дает мне другую ошибку. The property 'TranslationModelID' was not found in type 'PassingAttachedPropertyInControlTemplater.Translation'. [Line: 17 Position: 40]

<Page.Resources>
    <Style TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid>
                        <TextBlock local:Translation.TranslationModelID="{TemplateBinding local:Translation.TranslationModelID}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>

<Grid>
    <Button x:Name="btn" local:Translation.TranslationModelID="1" />
</Grid>

1 Ответ

0 голосов
/ 20 июня 2019

Я хочу назначить прикрепленное свойство шаблонного родителя присоединенному свойству элемента внутри ControlTemplate, используя TemplateBinding или обычную привязку

По вашему требованию вы можете создать шаблонный элемент управления, который наследует кнопку. Затем установите свойство TextBlock Attached в коде позади. Пожалуйста, проверьте следующий код сегмента.

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));
    }

}

Xaml

<Style TargetType="local:CustomButton" >
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:CustomButton">
                <Border
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                    <Grid>
                        <TextBlock x:Name="TBK"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
...