[英]WPF ContentControl Content as ContentControl
是否不可能具有包含ContentControl的多层UserControl?
我试图为派生的不同模型创建视图,所以我想消除为每种对象类型重新创建视图的需要,而是提供一个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>
它在UserControl上具有以下DependencyProperty
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>
同样,它像第一个一样在此UserControl上具有ContentControl的单个DependencyProperty。 我也尝试过使用其他名称的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); }
}
}
}
好的,所以在这一点上,一切似乎都正常。 我在UserControlLevel1的ContentControl中添加了其他内容,并在UserControlLevel2 UserControl中添加了另一个ContentControl。
问题是当我尝试引入UserControl或MainWindow的第3层时。 我添加到UserControlLevel2的ContentControl的任何内容都不会出现。
<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做错了? 我应该以其他方式看待这个问题吗?
有可能的。 系统无法解析Binding
的ElementName
。 解决的办法是使用相对绑定。 只需在UserControlLevel2中替换以下行即可完成:
<ContentControl Content="{Binding Path=ChildContent, RelativeSource={RelativeSource AncestorType={x:Type local:UserControlLevel2}}}"/>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.