2015-12-15 10 views
14

Ich habe ein Steuerelement in WPF codiert, das eines der drei untergeordneten Elemente haben kann - zwei SimpleChildElements und ein ComplexChildElement, sagen wir - und wechselt zwischen der Anzeige von ihnen abhängig von einigen hinter den Kulissen Logik in dem Modell, das mich lässt mach das.Prerendering/Versteckt unter Last mit 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> 

Die untergeordneten Elemente sind, ihre eigenen Viewmodels und ich habe einige Ressourcen Upstream erklärt wurde so für sie gibt es Datatemplates. Ich kann mehr ausarbeiten, wenn es hilft, aber das greifende Element des Problems ist das:

Wenn ich durch Elemente im Hauptsteuerelement blättern und ComplexChildElement zum ersten Mal erscheint, gibt es eine kurze, kaum sichtbare flackern, wie es dekoriert wird - es ist eine Reihe von Combo-Boxen mit DevExpress geschmückt. Diese Einstellung bedeutet, dass es kein Flimmern gibt, wenn ich einen Datensatz mit einem ComplexChildElement und wieder zurück blende, und wenn ich die Anzeige des Master-Steuerelements mit einem ComplexChildElement dort starte, flackert es nicht, wenn es wieder auftaucht.

Aber das Master-Steuerelement ist mit einer anderen Datenquelle verschlüsselt, und ich kann nicht garantieren, dass es ein ComplexChildElement im ersten Datensatz geben wird, die von einem größeren Display-Framework initialisiert wird im Moment.

Wie kann ich garantieren, dass ComplexChildElement beim Laden des Formulars gerendert wird und es möglicherweise sofort danach versteckt? Ich habe schon versucht ChildPanels.Active ein und aus in der Funktion dahinter Makeln:

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

aber das geht nicht, sie zu machen.

Diese Funktion, übrigens:

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

mit dem letzten Funktionsaufruf genannt, derjenige zu sein ändert das Kind Modell Sichtbarkeit, wenn die Aufzeichnung zu ändern. Wenn ich diesen letzten Aufruf nicht mache, beginnen alle untergeordneten Ansichtsmodelle sichtbar.

+0

„Ich habe bereits versucht ChildPanels.Active Makeln an und ab innerhalb der Funktion dahinter: ... aber das bringt sie nicht zum Rendern. " Ich denke, das ist ein guter Ort, um die Ansicht vorzumachen. Aber warum zeigt es sich überhaupt nicht? – Tyress

+0

IDK, obwohl ich die Funktion der Frage selbst hinzugefügt habe. Wenn ich Dinge im Debug-Modus laufe und einen Haltepunkt in der Funktion halte, sehe ich tatsächlich keine sichtbaren UI-Elemente, wenn es läuft, wenn das hilft. – Glazius

+0

Was macht ChangeChildModel()? :) Wenn du es entsorgst, wirst du es nicht wirklich vorrendern, oder? – Tyress

Antwort

2

Warum nicht die Sichtbarkeit von Anfang an auf falsch setzen? Dies hindert Sie nicht daran, die Bindung an Active danach zu verwenden.

Bindung ist in Ordnung, aber wie es von der Datatemplate verwendet wird Sichtbarkeit und von der übergeordneten Steuerung zu ändern, zu wissen, ob es das Kind Kontrolle machen sollte. Abhängig von der Subskriptionsreihenfolge zum PropertyChanged-Ereignis kann das übergeordnete Steuerelement das Steuerelement möglicherweise als sichtbar anzeigen oder nicht.

Übrigens, ich frage mich, ob Ihr erstes Ziel war nicht zu verhindern, Flackern, die beim Aufruf Show/Hide auf mehreren Steuerelementen auftreten kann. Ich bin mir nicht sicher, vor dem Rendern ist die richtige Lösung dafür.

auf die Ursache des Flimmerns Je gibt es bereits mehrere Fixes auf SO: