Ich bin neu bei WPF und MVVM. Ich denke, das ist eine einfache Frage. Mein ViewModel führt einen asynchronen Aufruf durch, um Daten für ein DataGrid zu erhalten, das an eine ObservableCollection im ViewModel gebunden ist. Wenn die Daten geladen werden, setze ich die richtige ViewModel-Eigenschaft und das DataGrid zeigt die Daten ohne Probleme an. Ich möchte jedoch einen visuellen Hinweis für den Benutzer einführen, dass die Daten geladen werden. Also, mit Blend, fügte ich das meinem Markup:Wie kann ich den VisualState in einer View vom ViewModel ändern?
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="LoadingStateGroup">
<VisualState x:Name="HistoryLoading">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="HistoryGrid">
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Hidden}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="HistoryLoaded">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="WorkingStackPanel">
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Hidden}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
Ich denke Ich weiß, wie man den Zustand in meinem Code-Behind (etwas ähnlich wie diese) zu ändern:
VisualStateManager.GoToElementState(LayoutRoot, "HistoryLoaded", true);
jedoch Der Ort, an dem ich dies tun möchte, ist in der I/O-Komplettierungsmethode meines ViewModel, die keinen Verweis auf die entsprechende View hat. Wie würde ich dies mit dem MVVM-Muster erreichen?
Dies ist eine interessante Technik. Vielen Dank. Ich kann diesen Weg gehen - aber ich möchte zuerst sehen, ob ich den VisualState der Ansicht basierend auf einer Änderung einer ViewModel-Eigenschaft irgendwie ändern kann. Ich denke, das ist der einzige Weg, wie ich Animationen machen kann - wie Ein- und Ausblenden basierend auf dem Zustand. –
Ich habe die Sichtbarkeitseigenschaft hier verwendet, aber Sie können in Ihrem benutzerdefinierten Steuerelement eine Abhängigkeitseigenschaft vom Typ boolean erstellen, die IsBusy-Eigenschaft an diese Eigenschaft binden und den visuellen Status im Steuerelement selbst ändern, wenn sich die Eigenschaft in a ändert spezifischer Wert. – decyclone
Diese Antwort ist awesommme !!! –