绑定来自两个不同用户控件的两个依赖项属性

时间:2018-06-30 13:58:15

标签: wpf data-binding user-controls dependency-properties

我创建了两个单独的用户控件,它们旨在一起工作。

第一个是带有拇指的简单用户控件,该拇指通过拖动使控件四处移动,这是简单且有效的。

XAML:

<Canvas>
    <Thumb x:Name="Thumb" Width="15" Height="15" DragDelta="Thumb_DragDelta"/>
</Canvas>

隐藏代码:名为 Position 的依赖项属性,在调用Setter时会更新用户控件的边距。

public partial class ThumbPoint : UserControl
{
    public Point Position
    {
        get { return (Point)GetValue(PositionProperty); }
        set { SetValue(PositionProperty, value); this.Margin = new Thickness(value.X, value.Y, 0, 0); }
    }

    // Using a DependencyProperty as the backing store for Position.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty PositionProperty =
        DependencyProperty.Register("Position", typeof(Point), typeof(ThumbPoint), new PropertyMetadata(new Point()));

    public ThumbPoint()
    {
        InitializeComponent();
        Position = new Point(0, 0);
    }

    private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
    {
        Position = new Point(Position.X + e.HorizontalChange, Position.Y + e.VerticalChange);
    }
}

第二个UserControl称为StraightLine,它由Line控件组成

XAML:

<Canvas>
    <Line x:Name="Line" Stroke="Gray" StrokeThickness="1"/>
</Canvas>

隐藏代码:名为 StartPosition 的依赖项属性,在调用Setter时会更新X1和Y1行(行的起始位置)。

public partial class StraightLine : UserControl
{
    public Point StartPosition
    {
        get { return (Point)GetValue(StartPositionProperty); }
        set { SetValue(StartPositionProperty, value); Line.X1 = value.X; Line.Y1 = value.Y; }
    }

    // Using a DependencyProperty as the backing store for StartPosition.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty StartPositionProperty =
        DependencyProperty.Register("StartPosition", typeof(Point), typeof(StraightLine), new PropertyMetadata(new Point()));

    public StraightLine()
    {
        InitializeComponent();

        Line.X1 = 0;
        Line.Y1 = 0;

        Line.X2 = 300;
        Line.Y2 = 200;
    }
}

在这里,我试图将它们绑定到mainwindow.xaml上:

<Canvas>
    <local:ThumbPoint x:Name="ThumbPoint"/>
    <local:StraightLine StartPosition="{Binding Position, ElementName=ThumbPoint}"/>
</Canvas>

所需效果:应更新StraightLine的DependencyProperty StartPosition。

发生了什么:它没有被更新,所以只有ThumbPoint在移动。

1 个答案:

答案 0 :(得分:0)

绑定不为DP(public Point StartPosition)使用公共属性包装器,而是直接使用SetValue(),因此不会调用setter中的代码。

需要的是propertyChangedCallback:

public Point StartPosition
{
    get { return (Point)GetValue(StartPositionProperty); }
    set { SetValue(StartPositionProperty, value); }
}

public static readonly DependencyProperty StartPositionProperty =
    DependencyProperty.Register("StartPosition", typeof(Point), typeof(StraightLine), new PropertyMetadata(new Point(), OnStartPositionChanged));

private static void OnStartPositionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{
   StraightLine c = (StraightLine) d;
   c.Line.X1 = c.StartPosition.X; 
   c.Line.Y1 = c.StartPosition.Y; 
}
在ThumbPoint public Point Position属性中的

有相同的问题,但是它在这里起作用,因为您直接使用了setter:Position = new Point()

或者将x1和Y1值绑定到xaml:

<Canvas>
    <Line x:Name="Line" Stroke="Gray" StrokeThickness="1"
          X1="{Binding StartPosition.X, RelativeSource={RelativeSource AncestorType=StraightLine}}"
          Y1="{Binding StartPosition.Y, RelativeSource={RelativeSource AncestorType=StraightLine}}"/>
</Canvas>

(或使用ElementName代替RelativeSource)