Domanda

Voglio creare un elemento WPF che, in fase di esecuzione, è in pieno controllo dei suoi elementi figli - aggiunta e la rimozione UI bambino quando le sue proprietà cambiamento. Qualcosa di un po 'come quello che ItemsControl fa quando si modifica la sua proprietà ItemsSource, anche se nel mio caso ci sarà un solo figlio.

Questo sarà un contenitore di vista per MVVM - quando si dà un modello o un ViewModel, sarà magicamente creare la corretta visione e il filo tutto. Non c'è bisogno per il mio contenitore al fine di essere templatable (in quanto crea viste definite dall'utente, che sono controlli utente e hanno i propri modelli), e preferirei che incapsulano il più possibile. Probabilmente potrei fare facilmente scendendo da qualcosa come griglia, e l'aggiunta di controlli figlio quando le mie proprietà cambiano; ma Griglia espone pubblicamente la sua collezione di elementi figlio e permette a chiunque di aggiungere e rimuovere roba.

classe che WPF devo scendere dal per la massima incapsulamento, e come posso aggiungere elementi figlio ad esso in fase di esecuzione?

Sulla base della mia comprensione delle docs, ho provato ad utilizzare FrameworkElement e AddVisualChild, solo per vedere se ho potuto creare controlli figlio in fase di esecuzione. Io non sono chiare sul fatto che l'AddLogicalChild è necessario, ma l'ho messo in proprio nel caso in cui:

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

Quando ho messo un ViewContainer in una finestra, ed eseguire questo, mi aspetto di vedere un TextBlock dicendo "ViewContainer". Ma invece, vedo solo una finestra vuota. Così, ovviamente, mi manca qualcosa.

Come posso risolvere il codice di cui sopra in modo che il controllo di "bambino" viene visualizzato in fase di esecuzione, ma non è esposto per gli altri a pasticciare con (non più di quanto può essere evitato)?

È stato utile?

Soluzione

Per rispondere alla tua domanda specifica, avrete anche bisogno di sostituzione GetVisualChild e proprietà VisualChildrenCount per attivare il vostro elemento secondario da visualizzare.

Altri suggerimenti

Avete mai pensato di sfruttare il supporto di WPF per DataTemplates impliciti?

Il modo in cui ho gestito un requisito simile al tuo è quello di utilizzare un ContentControl. Mi legano la proprietà Content al mio ViewModel. Ho poi fare in modo che nel Resource Dizionari riferimento da qualche parte nel albero sopra la ContentControl ho DataTemplates definiti per tutte le tipologie di ViewModels che potrebbero essere assegnati al Contenuto Proprietà.

In questo modo WPF si prende cura di cablaggio la corretta visione per il mio ViewModel.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top