TemplateBinding не привязывается к свойству эффекта?

Представьте себе такой элемент управления с именем Testko:

public class Testko: Control
    {
        public static readonly DependencyProperty TestValueProperty;

        static Testko()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(Testko), new FrameworkPropertyMetadata(typeof(Testko)));
            TestValueProperty = DependencyProperty.Register("TestValue", typeof(double), typeof(Testko), new UIPropertyMetadata((double)1));
        }

        public double TestValue
        {
            get { return (double)GetValue(TestValueProperty); }
            set { SetValue(TestValueProperty, value); }
        }
    }

Ничего особенного, просто пустой элемент управления с единственным свойством double со значением по умолчанию, равным (double) 1. Теперь изобразите общий стиль, подобный этому:

<Style TargetType="{x:Type local:Testko}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:Testko}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <StackPanel Orientation="Vertical">
                        <StackPanel.Effect>
                            <BlurEffect Radius="{TemplateBinding TestValue}" />
                        </StackPanel.Effect>
                        <Button Content="{TemplateBinding TestValue}" Margin="4" />
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Теперь проблема в том, что свойство Radius по какой-то причине никогда не привязано. Содержимое кнопки Wheras правильно привязано к свойству TestValue. Я уверен, что упускаю что-то очевидное. Или нет?


person Miha Markic    schedule 06.03.2010    source источник


Ответы (1)


Если очевидно, то не для меня :-)

В моей любимой книге (WPF Unleashed) упоминается, что иногда TemplatedBinding не работает (но перечисленные причины не соответствуют вашим обстоятельствам).

Но TemplatedBinding - это ярлык для:

{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TestValue}

Я воспроизвел ваш случай, т.е. изменение TestValue влияет только на кнопку. После замены TemplatedBinding этим я получаю желаемый эффект.

person Timores    schedule 07.03.2010
comment
После ответа я обнаружил, что stackoverflow.com/questions/1131222/, чей ответ довольно интересен относительно разницы между Binding и TemplateBinding. - person Timores; 07.03.2010
comment
Мне кажется, это какая-то ошибка. Спасибо за решение :-) - person Miha Markic; 07.03.2010
comment
Я получаю сообщение об ошибке отсутствия поля свойства зависимости в редакторе XAML в {TemplateBinding DialogHeight}, где DialogHeight - это свойство, принадлежащее классу, производному от INotifyPropertyChanged. Очевидно, что также возникают некоторые ошибки привязки во время выполнения. Изменение привязки, как вы посоветовали, решает мои проблемы. Спасибо. - person Scott Marlowe; 02.06.2011