难道不可能有包含UserControls的多层ContentControl吗?
我试图为派生的不同模型创建视图,因此我不需要为每种对象类型重新创建视图,而是提供一个ContentControl或一个ContentPresenter来注入“视图的其余部分”。但是,用这种方法我只能深入到一个层次。
下面是一个简化的示例(我已经删除了一些xmlns)。在我的例子中,我正在处理更复杂的视图,并试图在多个地方消除重复的代码,并关注以后的更改。
我有一个基本UserControl,我们叫它UserControlLevel1
<UserControl x:Class="ContentControlNesting.UserControlLevel1"
x:Name="userControlLevel1"
xmlns:local="clr-namespace:ContentControlNesting">
<StackPanel>
<TextBlock Text="UserControlLevel1ContentTop"/>
<ContentControl Content="{Binding ElementName=userControlLevel1, Path=ChildContent}"/>
<TextBlock Text="UserControlLevel2ContentBottom"/>
</StackPanel>
</UserControl>它在DependencyProperty上有下面的UserControl
namespace ContentControlNesting
{
public partial class UserControlLevel1 : UserControl
{
public UserControlLevel1()
{
InitializeComponent();
}
public static readonly DependencyProperty ChildContentProperty = DependencyProperty.Register("ChildContent", typeof(UIElement), typeof(UserControlLevel1), new PropertyMetadata(null));
public UIElement ChildContent
{
get { return (UIElement)GetValue(ChildContentProperty); }
set { SetValue(ChildContentProperty, value); }
}
}
}ContentControl将在以下名为UserControlLevel2的UserControl中使用。这个UserControl运行得很好,就像我期望的那样。更确切地说,UserControlLevel1在UserControlLevel2中正常工作。
<UserControl x:Class="ContentControlNesting.UserControlLevel2"
x:Name="userControlLevel2"
xmlns:local="clr-namespace:ContentControlNesting">
<local:UserControlLevel1>
<local:UserControlLevel1.ChildContent>
<StackPanel>
<TextBlock Text="UserControlLevel2ContentTop"/>
<ContentControl Content="{Binding ElementName=userControlLevel2, Path=ChildContent}"/>
<TextBlock Text="UserControlLevel2ContentBottom"/>
</StackPanel>
</local:UserControlLevel1.ChildContent>
</local:UserControlLevel1>
</UserControl>类似地,与第一个类似,它在此DependencyProperty上为ContentControl提供了一个单独的UserControl。我也尝试过使用不同的名称为DependencyProperties。
namespace ContentControlNesting
{
public partial class UserControlLevel1 : UserControl
{
public UserControlLevel1()
{
InitializeComponent();
}
public static readonly DependencyProperty ChildContentProperty = DependencyProperty.Register("ChildContent", typeof(UIElement), typeof(UserControlLevel1), new PropertyMetadata(null));
public UIElement ChildContent
{
get { return (UIElement)GetValue(ChildContentProperty); }
set { SetValue(ChildContentProperty, value); }
}
}
}好吧,在这一点上,一切看起来都很好。我在ContentControl of UserControlLevel1中添加了其他内容,在UserControlLevel1 UserControl中添加了另一个ContentControl。
问题是当我尝试引入UserControl或我的MainWindow的第三层时。我添加到ContentControl of UserControlLevel2的任何内容都不会出现。
<Window x:Class="ContentControlNesting.MainWindow"
xmlns:local="clr-namespace:ContentControlNesting"
Title="MainWindow" Height="200" Width="300">
<local:UserControlLevel2>
<local:UserControlLevel2.ChildContent>
<StackPanel>
<TextBlock Text="Main Window Content Text"/>
</StackPanel>
</local:UserControlLevel2.ChildContent>
</local:UserControlLevel2>
</Window>我是不是想做一些不可能的事?还是我对ContentControl和DependencyProperties做错了什么?我应该用不同的方法来看待这件事吗?
发布于 2016-05-04 18:12:23
这是可能的。系统无法解析ElementName中的Binding。解决方案是使用相对绑定。只需替换UserControlLevel2中的以下行,您就可以完成以下操作:
<ContentControl Content="{Binding Path=ChildContent, RelativeSource={RelativeSource AncestorType={x:Type local:UserControlLevel2}}}"/>https://stackoverflow.com/questions/37012516
复制相似问题