代码之家  ›  专栏  ›  技术社区  ›  Martin Liversage

在Silverlight中添加uielementCollection DependencyProperty

  •  3
  • Martin Liversage  · 技术社区  · 15 年前

    我要将依赖项属性添加到 UserControl 它可以包含 UIElement 物体。你可以建议我从 Panel 并使用 Children 属性,但在我的情况下,它不是一个合适的解决方案。

    我修改了我的 用户控制 这样地:

    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'.
    

    Setting a Property by Using a Collection Syntax 第节明确规定:

    […]不能在XAML中显式指定[uielementCollection],因为uielementCollection不是可构造类。

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

    2 回复  |  直到 11 年前
        1
  •  5
  •   Martin Liversage    15 年前

    我把我的财产类型从 UIElementCollection Collection<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);
        }
      }
    
    }
    

    在WPF中 ui元素集合 具有一些导航逻辑和可视树的功能,但在Silverlight中似乎没有。在Silverlight中使用另一种集合类型似乎不会带来任何问题。

        2
  •  1
  •   Jeff Wilcox    15 年前

    如果你在使用 Silverlight Toolkit ,system.windows.controls.toolkit程序集包含一个“objectcollection”,其设计目的是使此类操作在XAML中更容易执行。

    这确实意味着您的属性需要为ObjectCollection类型才能工作,因此您的强类型将丢失为uiElement。或者,如果它是IEnumerable类型(就像大多数 ItemsSource ,您可以显式定义 toolkit:ObjectCollection 对象在XAML中。

    考虑使用它,或者简单地借用 source to ObjectCollection (MS PL)并在项目中使用它。

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

    我还建议添加一个[ContentProperty]属性,这样设计时的体验会更干净一点。