3 Stimmen

Hinzufügen einer UIElementCollection DependencyProperty in Silverlight

Ich möchte eine Abhängigkeitseigenschaft zu einer UserControl die eine Sammlung von UIElement Objekte. Sie könnten vorschlagen, dass ich meine Kontrolle von folgenden Objekten ableiten sollte Panel und verwenden Sie die Children Eigenschaft, aber das ist in meinem Fall keine geeignete Lösung.

Ich habe meine UserControl wie diese:

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);
    }
  }

}

und ich benutze es so:

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

Leider erhalte ich den folgenden Fehler, wenn ich die Anwendung ausführe:

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

In der Einstellen einer Eigenschaft mithilfe einer Auflistungssyntax Abschnitt heißt es ausdrücklich, dass:

[...] können Sie [UIElementCollection] nicht explizit in XAML angeben, da UIElementCollection keine konstruierbare Klasse ist.

Was kann ich tun, um mein Problem zu lösen? Ist die Lösung einfach, eine andere Auflistungsklasse anstelle von UIElementCollection ? Wenn ja, welche Sammelklasse wird empfohlen?

5voto

Martin Liversage Punkte 100306

Ich habe den Typ meiner Eigenschaft von UIElementCollection zu Collection<UIElement> und das scheint das Problem zu lösen:

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);
    }
  }

}

In WPF UIElementCollection verfügt über einige Funktionen zum Navigieren im logischen und visuellen Baum, aber das scheint in Silverlight nicht vorhanden zu sein. Die Verwendung eines anderen Sammlungstyps in Silverlight scheint kein Problem darzustellen.

0 Stimmen

Noch einfacher - gut, dass es funktioniert. Als ich es versuchte, vergaß ich, die anfängliche Eigenschaft Metadaten auf eine Instanz der Sammlung zu setzen.

1voto

Jeff Wilcox Punkte 6355

Wenn Sie die Silverlight-Werkzeugsatz Die System.Windows.Controls.Toolkit-Assembly enthält eine "ObjectCollection", die entwickelt wurde, um diese Art von Aufgaben in XAML zu erleichtern.

Es bedeutet, dass Ihre Eigenschaft vom Typ ObjectCollection sein müsste, um zu funktionieren, so dass Sie Ihre starke Typisierung auf UIElement verlieren. Alternativ, wenn es ein IEnumerable Typ ist (wie die meisten ItemsSource ), könnten Sie explizit die toolkit:ObjectCollection Objekt in XAML.

Ziehen Sie in Erwägung, dies zu verwenden, oder leihen Sie sich einfach die Quelle zu ObjectCollection (Ms-PL) und verwenden Sie es in Ihrem Projekt.

Es mag einen Weg geben, den Parser in einem Sammlungsszenario zum Funktionieren zu bringen, aber das hier ist etwas einfacher.

Ich würde auch empfehlen, ein [ContentProperty]-Attribut hinzuzufügen, damit die Design-Zeit-Erfahrung ein wenig sauberer ist.

0 Stimmen

Vielen Dank für Ihren Beitrag und Ihren netten Kommentar zu ContentProperty (was in meinem Fall nicht zutrifft).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X