2015-12-15 11 views
14

Ho un controllo codificato in WPF che può avere uno dei tre elementi figlio - due SimpleChildElement e un ComplexChildElement, diciamo - e lo scambio tra la visualizzazione di essi in base a qualche logica dietro le quinte nel modello che mi consente Fai questo.Prerendering/hiding on load con WPF MVVM?

<ItemsControl 
    ItemsSource="{Binding ChildPanels.Values}" 
    Name="ContentControl1" 
    > 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding}" 
      Visibility="{Binding Path=Active, Converter={StaticResource BooleanToVisibilityConverter}}"/> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Gli elementi secondari sono i propri ViewModels e ho alcune risorse dichiarate a monte quindi ci sono DataTemplates per loro. Posso approfondire l'argomento se questo può essere d'aiuto, ma l'elemento cruciale del problema è questo:

Quando sto scorrendo gli elementi nel controllo principale e ComplexChildElement appare per la prima volta, c'è un breve, appena visibile sfarfallio come viene decorato - è un mucchio di scatole combinate decorate con DevExpress. Questa impostazione significa che non c'è sfarfallio quando faccio scorrere un record con ComplexChildElement e di nuovo indietro, e se inizio la visualizzazione del controllo master con un ComplexChildElement, non c'è sfarfallio quando si apre di nuovo.

Ma il controllo principale è impostato su un'altra origine dati e non posso garantire che ci sarà un ComplexChildElement nel primo record, che viene caricato in fase di inizializzazione da un quadro di visualizzazione più grande. Non voglio davvero fare il root al momento.

Quindi, come posso garantire che ComplexChildElement venga sottoposto a rendering quando il modulo viene caricato e, eventualmente, nascosto subito dopo? Ho già provato la commutazione ChildPanels.Active e disattivare all'interno della funzione dietro questo:

<dxmvvm:Interaction.Triggers> 
    <dxmvvm:EventToCommand EventName="Loaded" Command="{Binding OnViewLoadedCommand}" /> 
</dxmvvm:Interaction.Triggers> 

ma questo non farli per il rendering.

Tale funzione, tra l'altro:

foreach (var childModel in ChildPanels.Values) 
    { 
    childModel.Active = true; 
    RaisePropertyChanged(() => childModel.Active); 
    } 
ChangeChildModel(); 

con l'ultima chiamata di funzione di essere colui che è chiamato a modificare la visibilità modello del bambino quando il record modifiche. Se non effettuo l'ultima chiamata, tutti i modelli di visualizzazione figlio iniziano visibili.

+0

"Ho già provato la commutazione ChildPanels.Active dentro e fuori la funzione dietro a questo: ... ma questo non gli permette di renderizzare. " Penso che sia un buon posto per pre-renderizzare la vista. Ma perché non lo mostra affatto? – Tyress

+0

IDK, anche se ho aggiunto la funzione alla domanda stessa. Quando eseguo le cose in modalità di debug e inserisco un punto di interruzione nella funzione, in realtà non vedo alcun elemento dell'interfaccia utente visibile quando è in esecuzione, se questo aiuta. – Glazius

+0

Cosa fa ChangeChildModel()? :) Se lo smaltisci non lo stai pre-rendering, vero? – Tyress

risposta

2

Perché non impostare la visibilità a destra fin dall'inizio? Ciò non impedisce di utilizzare il binding su Active in seguito.

Il collegamento è OK, ma poiché viene utilizzato dal DataTemplate per modificare Visibilità e dal controllo padre per sapere se deve eseguire il rendering del controllo figlio. Pertanto, in base all'ordine di abbonamento all'evento PropertyChanged, il controllo parent può visualizzare o meno il controllo come Visibile.

A proposito, mi chiedo se il tuo primo obiettivo non fosse quello di evitare lo sfarfallio che potrebbe verificarsi quando chiami Mostra/Nascondi su diversi controlli. Non sono sicuro che il pre rendering sia la soluzione giusta per questo.

A seconda della causa principale di sfarfallio, ci sono già diverse correzioni su SO: