Привязка AttachedProperty к свойству объекта - PullRequest
2 голосов
/ 12 июля 2011

Я пытаюсь привязать прикрепленные свойства 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.

1 Ответ

1 голос
/ 12 июля 2011

То, что у вас есть, недействительно.Ваш 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>
...