首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF ContentControl内容为ContentControl

WPF ContentControl内容为ContentControl
EN

Stack Overflow用户
提问于 2016-05-03 19:11:50
回答 1查看 3K关注 0票数 0

难道不可能有包含UserControls的多层ContentControl吗?

我试图为派生的不同模型创建视图,因此我不需要为每种对象类型重新创建视图,而是提供一个ContentControl或一个ContentPresenter来注入“视图的其余部分”。但是,用这种方法我只能深入到一个层次。

下面是一个简化的示例(我已经删除了一些xmlns)。在我的例子中,我正在处理更复杂的视图,并试图在多个地方消除重复的代码,并关注以后的更改。

我有一个基本UserControl,我们叫它UserControlLevel1

代码语言:javascript
复制
<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

代码语言:javascript
复制
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中正常工作。

代码语言:javascript
复制
<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。

代码语言:javascript
复制
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的任何内容都不会出现。

代码语言:javascript
复制
<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做错了什么?我应该用不同的方法来看待这件事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-04 18:12:23

这是可能的。系统无法解析ElementName中的Binding。解决方案是使用相对绑定。只需替换UserControlLevel2中的以下行,您就可以完成以下操作:

代码语言:javascript
复制
<ContentControl Content="{Binding Path=ChildContent, RelativeSource={RelativeSource AncestorType={x:Type local:UserControlLevel2}}}"/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37012516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档