如何使Silverlight UserControl成为内容容器?

时间:2009-08-07 11:27:31

标签: .net wpf silverlight user-controls

我正在制作Silverlight UserControl,其中控件的使用者需要能够提供自定义属性和内容。我认为这就像将自定义属性公开为依赖属性并从ContentControl派生一样简单,但显然不是。

以下是我对此的疑问:

  1. 我将该属性作为一个简单的依赖属性工作,但是为了将它绑定到控件本身的UI,我不得不将控件的DataContext设置为它自己的类(this.DataContext = this) 。这种感觉到处都很脏......有没有更好的方法呢?

  2. 我可以让我的自定义控件的使用者使用Content子元素进行编译,但我不知道如何在控件本身中显示它。我在想一个ContentPresenter,其内容绑定到当前绑定上下文中的内容,但这不起作用。

  3. 我想让它发挥作用,但我也对推荐/最佳实践是什么以及为什么感兴趣。我在搜索这些东西时遇到了困难。

1 个答案:

答案 0 :(得分:4)

注意:我没有Silverlight经验,但在WPF中我会做以下

假设您有一个控件MyControl,它派生自UserControl,具有属性MyProperty。我认为最漂亮的是为你的控件定义一个ControlTemplate:

<UserControl.Template>
    <ControlTemplate TargetType="{x:Type SomeNamespace:MyControl}">
        <StackPanel>
            <TextBlock Text="{TemplateBinding MyProperty}"/>
            <ContentPresenter/>
        </StackPanel>
    </ControlTemplate>
</UserControl.Template>

使用{TemplateBinding},您可以快速创建(OneWay!)绑定到控件的属性,同时您仍然可以使用普通的{Binding}语法绑定到您的实际DataContext。 在ControlTemplate中放置ContentPresenter将自动显示您的内容属性中的任何内容。