我有一个基于ContentControl类型的对象,我想在其内容中嵌入自定义控件。下面是代码。
问题是我需要MyContainer有一个MyControl对象列表,以便它可以与它们通信,每个MyControl都需要一个对它的MyContainer的引用。
这是如何做得好的?我看到的一种方法是在MyControl上声明一个附加属性并将其设置为MyContainer对象的名称,但这似乎是多余的,因为MyCOntrol对象可以搜索可视树来查找容器。如果搜索是正确的方法,我会在哪里放置搜索代码?在MyControl构造函数中?
感谢任何输入 康斯坦丁
public class MyContainer : ContentControl
{
...
}
public class MyConrol : Control
{
...
}
<c:MyContainer>
<Grid>
<c:MyControl />
</Grid>
</c:MyContainer>
答案 0 :(得分:0)
您可以将属性MyControls
添加到MyContainer
类,为MyContainer
创建一个模板,其中包含一个列表(ItemsControl
,ListBox
或其他一些列表控制),将列表本身放在示例代码的网格中,将列表的ItemsSource
绑定到MyControls
属性。
要在XAML中获取控件的容器,可以使用设置为FindAncestor的RelativeSource绑定。
如果你需要从代码中找到容器,你应该每次都这样做,或者在第一次使用时缓存值(可以将控件移动到另一个容器吗?)。 Contructor不是合适的地方,因为创建了第一个控件,然后才将它放入树中。
附加属性绝对没必要。