繁体   English   中英

如何从 WPF 中的另一个 UserControl 绑定或引用 UserControl?

[英]How to bind or reference a UserControl from another UserControl in WPF?

在我的应用程序中,我有一个UserControl ,它承载另一个UserControl ,如下所示:

<UserControl x:Class="FooControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MyApp">
    <local:BarControl x:Name="NestedControl" />
</UserControl>

现在在托管的BarControl中,我想计算它的 position,相对于托管的FooControl控件。 目前我正在从FooControl的代码后面调用子控件的成员,如下所示:

this.NestedControl.ComputeRelativePos(this);

在这种方法中,我计算 position 如下:

public void ComputeRelativePos(Control relativeTo)
{
    var pos = this.TranslatePoint(new System.Windows.Point(0, 0), relativeTo);

    // ...
}

现在我想消除这个调用并从嵌套 BarControl 的事件处理程序(例如SizeChanged )重新计算BarControl 我想这样做,以便BarControl不需要托管在FooControl或其他控件中,显式调用ComputeRelativePos

public BarControl()
{
    this.InitializeComponent();
    this.SizeChanged += (sender, args) => 
    {
        this.ComputeRelativePos(this.OuterControl);
    };
}

但是,我不太确定如何为OuterControl属性创建绑定。 我已经定义了这样的属性:

public Control OuterControl
{
    get { return this.GetValue(OuterControlProperty) as Control; }
    set { this.SetValue(OuterControlProperty, value); }
}

public static readonly DependencyProperty OuterControlProperty = 
    DependencyProperty.Register("OuterControl", typeof(Control), typeof(BarControl), new UIPropertyMetadata(null));

并在FooControl标记中定义绑定,如下所示:

<local:BarControl x:Name="NestedControl" OuterControl="{Binding RelativeSource={RelativeSource Self}}" />

OuterControl似乎没有正确设置:

this.SizeChanged += (sender, args) => this.ComputeRelativePos(this.OuterControl); // this.OuterControl is `null`

我还尝试绑定到FooControl实例名称1

<local:BarControl x:Name="NestedControl" 
    OuterControl="{Binding RelativeSource={RelativeSource Self}, Path=Name}" />

...这样我就可以从可视化树中查询它(就像这里建议的那样),但它也不起作用。

所以我的一般问题是,如何访问绑定到子属性的父控件? 我也会接受解决此问题的替代方法,因为我对 XAML/WPF 相当缺乏经验。

提前致谢。

1当然,相应地定义DependencyProperty

我不想 go 详细说明您在做什么以及为什么,但是要使依赖项属性正常工作,您必须进行更改:

<local:BarControl x:Name="NestedControl" 
OuterControl="{Binding RelativeSource={RelativeSource Self}, Path=Name}" />

至:

<local:BarControl x:Name="NestedControl" OuterControl="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" />

当这样说时,您的事件处理程序大小更改将在设置依赖项控制之前被命中。 在控件初始化后设置依赖属性。

但是之后,当您调整大小时,您会看到 relativeTo 设置为 FooControl。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM