将附加属性绑定到对象属性

时间:2011-07-12 14:54:06

标签: .net wpf wpf-controls binding styles

我正在尝试将Canvas.LeftCanvas.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 个答案:

答案 0 :(得分: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>