Привязка AttachedProperty к свойству объекта

Я пытаюсь связать присоединенные свойства Canvas.Left и Canvas.Top с моими настраиваемыми свойствами X и Y, но безуспешно, я использую следующий XAML.

<Style TargetType="{x:Type layout:BankBaseControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type layout:BankBaseControl}">
                <ContentPresenter Content="{TemplateBinding Marker}" >
                    <ContentPresenter.ContentTemplate>
                        <DataTemplate>
                            <Ellipse Fill="Red" Width="{Binding Width}"
                                     Height="{Binding Height}"
                                     Canvas.Left="{Binding X, Mode=TwoWay}"
                                     Canvas.Top="{Binding Y, Mode=TwoWay}"/>
                        </DataTemplate>
                    </ContentPresenter.ContentTemplate>
                </ContentPresenter>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Стиль применяется правильно (привязка ширины и высоты работает правильно), но прикрепленные свойства, похоже, не учитывают значения X и Y. Я попытался выполнить эту привязку из кода с помощью:

SetBinding(Canvas.LeftProperty, new Binding("X")
    { Source = Marker,  Mode = BindingMode.TwoWay });

И это сработало, но я бы очень хотел сделать это из XAML.

РЕДАКТИРОВАТЬ: Я также попытался изменить привязки в XAML на Canvas.Left="100" Canvas.Top="100", но не повезло, эллипс все равно будет отображаться на координатах 0,0.


person So Many Goblins    schedule 12.07.2011    source источник
comment
Пожалуйста, подтвердите, что у вас есть свойства зависимостей XProperty и YProperty, определенные в вашем элементе управления должным образом.   -  person Bek Raupov    schedule 12.07.2011
comment
являются ли свойства зависимости свойств x и y?   -  person Muad'Dib    schedule 12.07.2011
comment
насколько я знаю, чтобы расширение {Binding} работало, Источник должен быть свойством зависимости.   -  person Bek Raupov    schedule 12.07.2011
comment
Были ли у вас какие-либо ошибки привязки в консоли, вы используете Source = Marker в коде, но не в xaml.   -  person anivas    schedule 12.07.2011
comment
X и Y являются обычными (не зависимыми) свойствами в моем объекте Marker, их значения установлены правильно. На консоли ошибок нет.   -  person So Many Goblins    schedule 12.07.2011
comment
Я также попытался изменить привязки в XAML на Canvas.Left="100" Canvas.Top="100", но не повезло, эллипс все равно отображался на координатах 0,0.   -  person So Many Goblins    schedule 12.07.2011


Ответы (1)


То, что у вас есть, недействительно. Ваш Ellipse не является дочерним элементом Canvas, поэтому вложенные свойства Canvas не будут использоваться. Ваш Ellipse является дочерним элементом ContentPresenter, который является дочерним элементом вашего BankBaseControl.

Вам нужно будет установить прикрепленные свойства в BankBaseControl, предполагая, что он размещен на панели Canvas следующим образом:

<Style TargetType="{x:Type layout:BankBaseControl}">
    <Setter Property="Canvas.Left" Value="{Binding RelativeSource="{RelativeSource Self}, Path=Marker.X, Mode=TwoWay}" />
    <Setter Property="Canvas.Top" Value="{Binding RelativeSource="{RelativeSource Self}, Path=Marker.Y, Mode=TwoWay}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type layout:BankBaseControl}">
                <ContentPresenter Content="{TemplateBinding Marker}" >
                    <ContentPresenter.ContentTemplate>
                        <DataTemplate>
                            <Ellipse Fill="Red" Width="{Binding Width}" Height="{Binding Height}" />
                        </DataTemplate>
                    </ContentPresenter.ContentTemplate>
                </ContentPresenter>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
person CodeNaked    schedule 12.07.2011