2012-04-09 12 views
0

Ich habe eine Listbox Elementvorlage, die visuelle Zustände enthält. Ich habe DisplayStateBehaviors, die die Zustände auf die Ein/Aus-Zustände festlegen. Meine Implementierung funktioniert nur 1/2. Bei der ersten Anzeige ist der Basiszustand unabhängig vom Wert im DataContext aktiv. Wenn sich die Daten im DataContext ändern, wird der richtige Status aktiviert.DisplayStateBehavior nicht zu Beginn Zustandsübergang in Listbox Elementvorlage

Wie bekomme ich den richtigen Zustand bei der ersten Anzeige der Listbox angezeigt.

Aus Sicherheitsgründen kann ich XAML- oder View-Model-Code nicht kopieren/einfügen.

Bearbeiten: Während ich den echten Code nicht kopieren/einfügen kann, reproduziert das folgende Skelett hoffentlich das Problem.

In einer global sichtbaren Ressourcendatei:

<DataTemplate x:Key="MyObjectItemTemplate"> 
    <Grid> 
    <VisualStateManager.VisualStateGroups> 
     ... blend goodness ... 
    </VisualStateManager.VisualStateGroups> 
    </Grid> 
</DataTemplate> 

Der Datenkontext wird in die Datenvorlage übergibt, indem sie es mit dem ItemsTemplate Attribute des listbox in der Haupt-UI-Zuordnung.

<ListBox ... ItemTemplate="{DynamicResource MyObjectItemTemplate}" .../> 
+1

Sie wissen nicht viel über DisplayStateBehaviors, aber mein erster Versuch, eine schnelle Lösung würde auf dem Grundstück InvokePropertyChanged sein die Datacontext in einer Zeit gebunden ist, wo Sie wissen, eingerichtet werden soll alles los ist. Wenn Ihr DisplayStateBehavior überhaupt von den Eigenschaften des Datenkontexts abhängig ist und gebunden ist, bevor das Datenkontextobjekt vollständig erstellt wurde, hat es keine weitere Möglichkeit, sich selbst zu aktualisieren, bis sich der Datenkontext erneut ändert. – Alain

+0

Das war mein Plan, um dies zu hacken, aber es scheint nicht so, dass es nötig sein sollte. Das fühlt sich an wie ein Symptom für mich, Dinge falsch zu verstehen oder die falsche Methode zu verwenden, da dies in meinen Augen ein häufiger Anwendungsfall ist. Wenn mein Ansatz fehlerhaft ist, würde ich lieber "mach es richtig, einmal". – PatrickV

+0

Dies ist ohne den Code schwer zu beantworten. Ich habe Fragen wie "was ist ein DisplayStateBehavior", "wie ist die Form des DataContext" und "wie wird der DataContext geliefert?". Es gibt viele Möglichkeiten, etwas falsch zu machen, aber es ist schwer, einen möglichen Fehltritt ohne den Code zu sehen. –

Antwort

0

Ich habe mein Problem gefunden. In dem Fall, dass es anderen hilft, was ich getan habe, um es zu beheben, war es, die Eingeweide des DataTemplate in ein UserControl zu extrahieren. Dies hat alles funktioniert, wie ich es erwartet hatte. Das DataTemplate existiert noch und ist immer noch beteiligt, aber es hat nur ein Element - das Benutzersteuerelement. Die visuellen Zustände sind alle Teil der Benutzersteuerung.

In einer global sichtbar Ressourcendatei:

<DataTemplate x:Key="MyObjectItemTemplate"> 
    <MyNamespace:MyUserControl/> 
</DataTemplate> 

in einer getrennten Datei MyUserControl.cs

<UserControl ... x.Class="MyNamespace.MyUserControl" ...> 
    <Grid> 
    <VisualStateManager.VisualStateGroups> 
     ... blend goodness ... 
    </VisualStateManager.VisualStateGroups> 
    </Grid> 
</UserControl> 

der Datenkontext in die Datenvorlage übergeben wird, indem es mit dem Attribute des ItemsTemplate der assoziierende Listbox in der Hauptbenutzeroberfläche.

<ListBox ... ItemTemplate="{DynamicResource MyObjectItemTemplate}" .../> 
+0

Sie könnten Ihre Frage mit Ihrer Antwort beantwortet haben. –

+0

Es gibt eine 2-tägige Wartezeit, bevor ich das tun kann. – PatrickV