Frage

Ich mag ein WPF-Element erstellen, die zur Laufzeit ist, die volle Kontrolle über seine untergeordneten Elemente - Hinzufügen und Kind UI zu entfernen, wenn seine Eigenschaften ändern. Etwas ein bisschen wie das, was Item tut, wenn man seine Itemssource-Eigenschaft ändern, obwohl in meinem Fall nur ein Kind sein wird.

Dies wird eine Ansicht, Behälter für MVVM sein - wenn Sie es ein Modell oder ein Ansichtsmodell geben, wird es auf magische Weise die korrekte Ansicht und Draht alles erstellt werden. Es gibt keine Notwendigkeit für meine Ansicht Container templatable sein (da es benutzerdefinierte Ansichten erstellt, die Benutzersteuerelemente sind und haben ihre eigenen Vorlagen), und ich würde es vorziehen, dass es so viel wie möglich zu kapseln. Ich konnte dies wahrscheinlich tun leicht von so etwas wie Gitter absteigend, und das Hinzufügen von untergeordneten Steuerelemente, wenn meine eigenen Eigenschaften zu ändern; aber Grid öffentlich macht seine Sammlung von untergeordneten Elementen und läßt jemand Hinzufügen und Entfernen von Material.

Welche WPF-Klasse soll ich stamme von für maximale Verkapselung, und wie kann ich Kind-Elemente, um es zur Laufzeit hinzufügen?

Basierend auf meinem Verständnis von der Dokumentation, habe ich versucht, Framework und AddVisualChild verwendet, nur um zu sehen, ob ich untergeordnete Steuerelemente zur Laufzeit erstellen konnte. Ich bin nicht klar, ob die AddLogicalChild notwendig ist, aber ich habe es in dem Fall der Fälle:

public class ViewContainer : FrameworkElement {
    private TextBlock _child;

    public ViewContainer() {
        _child = new TextBlock { Text = "ViewContainer" };
        AddLogicalChild(_child);
        AddVisualChild(_child);
        InvalidateMeasure();
    }

    public object Content { get; set; }

    protected override Size ArrangeOverride(Size finalSize) {
        _child.Arrange(new Rect(finalSize));
        return finalSize;
    }
    protected override Size MeasureOverride(Size availableSize) {
        _child.Measure(availableSize);
        return _child.DesiredSize;
    }
}

Wenn ich eine ViewContainer in ein Fenster gestellt, und führen Sie dies, erwarte ich einen Textblock zu sehen, sagen: „ViewContainer“. Aber stattdessen sehe ich nur ein leeres Fenster. So offensichtlich fehlt mir etwas.

Wie kann ich den obigen Code zu beheben, so dass die „Kind“ Steuerung zur Laufzeit angezeigt wird, ist aber nicht für andere zu verwirren mit (sowenig vermieden werden kann) ausgesetzt?

War es hilfreich?

Lösung

Ihre Frage beantworten, werden Sie auch außer Kraft setzen müssen GetVisualChild und Visual Eigenschaften Ihr Kind Element zu ermöglichen, angezeigt werden.

Andere Tipps

Haben Sie sich Gedanken über die Vorteile von WPF Unterstützung für implizites Datatemplates zu nehmen?

So wie ich eine Anforderung ähnlich wie bei Ihnen behandelt haben, ist durch einen ContentControl verwenden. Ich band die Content eigenschaft auf mein Ansichtsmodell. Ich mache dann sicher, dass in der Ressourcen Wörterbücher irgendwo über dem Content ich im Baum verwiesen haben Datatemplates für alle Arten von Viewmodels definiert, die dem Content-Eigenschaft zugeordnet werden könnten.

Auf diese Weise WPF kümmert sich um die Verdrahtung auf die richtige Ansicht für meine Ansichtsmodell.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top