如何实现内部内容依赖属性?

4

我正在尝试使用依赖属性实现一个用户控件。这是我的问题:我想使用布局子元素或子元素集合来设置依赖属性。这是否可行,如何完成?

    <custom:myControl1>
        <Label>Controls</Label>
        <Label>I want</Label>
        <Label>to set</Label>
        <Label>as the dependency property</Label>
        <Button Content="Is it possible?" />
    </custom:myControl1>
2个回答

18

是的,在你的UserControl的XAML中声明一个ContentControl
让它绑定到你UserControl后台的DependencyPropertyContent属性上。
在你的UserControl类顶部添加属性:[ContentProperty("Name_Of_Your_Dependency_Property")]

然后你可以像你在问题中所做的那样去实现。这个属性定义了默认的依赖属性,这样你就不需要指定<custom:myControl1.MyDP>

像下面这样:

[ContentProperty("InnerContent")]
public class MyControl : UserControl
{
   #region InnerContent
        public FrameworkElement InnerContent
        {
            get { return (FrameworkElement)GetValue(InnerContentProperty); }
            set { SetValue(InnerContentProperty, value); }
        }

        // Using a DependencyProperty as the backing store for InnerContent.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty InnerContentProperty =
            DependencyProperty.Register("InnerContent", typeof(FrameworkElement), typeof(MyControl), new UIPropertyMetadata(null));
        #endregion
}

<UserControl ...>
   <ContentControl Content="{Binding InnerContent, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" />
</UserControl>

如果从Control继承,你能做同样的事情吗?出于某些原因,我无法使它工作。 - Stefan Vasiljevic
它在Grid上无法工作吗?我尝试将FrameworkElement和UIElement作为内容的DP。 - Mechandrius
编辑:DP 中有一个拼写错误。请仅返回翻译后的文本。 - Mechandrius

0

按预期工作。

  1. 创建了一个UserControl并添加了ContentControl,将DP绑定到它上面。 (在代码后台中按照上述解决方案创建DP。
<UserControl x:Class="WpfTry2.Controls.DummyContentControl"
... x:Name="dummyContent">
   <Grid>
        <ContentControl Content="{Binding InnerContent, ElementName=dummyContent}"/>
   </Grid>
</UserControl>
  • 在窗口中使用了用户控件

  • <controls:DummyContentControl>
                <controls:DummyContentControl.InnerContent>
                    <Grid Background="Aqua" HorizontalAlignment="Center" VerticalAlignment="Center">
                        <TextBlock Text="InnerContent" FontSize="32"></TextBlock>
                    </Grid>
                </controls:DummyContentControl.InnerContent>
    </controls:DummyContentControl>
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接