3

我想将依赖属性添加到UserControl可以包含UIElement对象集合的 a 中。您可能会建议我应该从中获得控制权Panel并为此使用该Children属性,但在我的情况下这不是一个合适的解决方案。

我已经这样修改了UserControl

public partial class SilverlightControl1 : UserControl {

  public static readonly DependencyProperty ControlsProperty
    = DependencyProperty.Register(
      "Controls",
      typeof(UIElementCollection),
      typeof(SilverlightControl1),
      null
    );

  public UIElementCollection Controls {
    get {
      return (UIElementCollection) GetValue(ControlsProperty);
    }
    set {
      SetValue(ControlsProperty, value);
    }
  }

}

我正在这样使用它:

<local:SilverlightControl1>
  <local:SilverlightControl1.Controls>
    <Button Content="A"/>
    <Button Content="B"/>
  </local:SilverlightControl1.Controls>
</local:SilverlightControl1>

不幸的是,当我运行应用程序时出现以下错误:

Object of type 'System.Windows.Controls.Button' cannot be converted to type
'System.Windows.Controls.UIElementCollection'.

使用集合语法设置属性部分中明确指出:

[...] 您不能在 XAML 中显式指定 [UIElementCollection],因为 UIElementCollection 不是可构造的类。

我能做些什么来解决我的问题?解决方案是否只是使用另一个集合类而不是UIElementCollection?如果是,推荐使用什么集合类?

4

2 回答 2

5

我将属性的类型从更改UIElementCollectionCollection<UIElement>,这似乎解决了问题:

public partial class SilverlightControl1 : UserControl {

  public static readonly DependencyProperty ControlsProperty
    = DependencyProperty.Register(
      "Controls",
      typeof(Collection<UIElement>),
      typeof(SilverlightControl1),
      new PropertyMetadata(new Collection<UIElement>())
    );

  public Collection<UIElement> Controls {
    get {
      return (Collection<UIElement>) GetValue(ControlsProperty);
    }
  }

}

在 WPFUIElementCollection中,有一些功能可以导航逻辑和可视化树,但在 Silverlight 中似乎没有。在 Silverlight 中使用另一种集合类型似乎不会造成任何问题。

于 2009-08-19T16:13:06.937 回答
1

如果您使用的是Silverlight Toolkit,则 System.Windows.Controls.Toolkit 程序集包含一个“ObjectCollection”,旨在使此类事情在 XAML 中更容易执行。

这确实意味着您的属性需要是 ObjectCollection 类型才能工作,因此您失去了对 UIElement 的强类型。或者,如果它是 IEnumerable 类型(如 most ),您可以在 XAML 中ItemsSource显式定义该对象。toolkit:ObjectCollection

考虑使用它,或者只是将源代码借用到 ObjectCollection (Ms-PL) 并在您的项目中使用它。

可能有一种方法可以让解析器在集合场景中实际工作,但这感觉更容易一些。

我还建议添加一个 [ContentProperty] 属性,以便设计时体验更清晰。

于 2009-08-19T15:51:03.613 回答