![](/img/trans.png)
[英]How to pass information from one WPF UserControl to another WPF 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.