繁体   English   中英

WPF ContentControl内容作为ContentControl

[英]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做错了? 我应该以其他方式看待这个问题吗?

有可能的。 系统无法解析BindingElementName 解决的办法是使用相对绑定。 只需在UserControlLevel2中替换以下行即可完成:

<ContentControl Content="{Binding Path=ChildContent, RelativeSource={RelativeSource AncestorType={x:Type local:UserControlLevel2}}}"/>

暂无
暂无

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

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