Wie kann ich das ändern das VisualState in einer Ansicht aus dem ViewModel?
Ich bin neu in WPF und MVVM. Ich denke, das ist eine einfache Frage. Mein ViewModel ist die Durchführung einer asynchron aufrufen, um die Daten bei einem DataGrid, die gebunden ist an eine ObservableCollection im ViewModel. Wenn die Daten geladen sind, habe ich die richtige ViewModel-Eigenschaft und zeigt das DataGrid die Daten mit kein problem. Jedoch möchte ich Euch einen visuellen Hinweis für den Benutzer, dass die Daten laden. Also, mit Mischung, ich habe dies nur Hinzugefügt, um mein markup:
<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 ich den Zustand ändern in meinem code-behind (ähnlich):
VisualStateManager.GoToElementState(LayoutRoot, "HistoryLoaded", true);
Jedoch, der Ort, wo ich das tun möchte, ist in der I/O completion " - Methode von meinem ViewModel, die nicht über einen Verweis auf die entsprechende Ansicht. Wie würde ich dies bewerkstelligen mit dem MVVM-Muster?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie etwas wie das hier tun :
XAML
Code:
----------------------- Aktualisierten code -----------------------
XAML
Vorlage
Benutzerdefiniertes Element
Den standard-Weg, dies ist normalerweise eine Eigenschaft, die in der viewmodel (entweder Abhängigkeitseigenschaft oder eine Teilnahme an INotifyPropertyChanged) würde das bedeuten, dass die Daten laden - vielleicht
bool IsLoadingData
oder ähnliches. Setzen Sie ihn auf true, wenn Sie anfangen zu laden, und legen Sie ihn auf false, wenn Sie fertig sind.Dann würden Sie binden einen trigger oder visual state-Eigenschaft in der Ansicht, und verwenden Sie die Ansicht, um zu beschreiben, wie der Benutzer, dass die Daten laden.
Dieser Ansatz behält die Trennung, wo das viewmodel ist die logische Darstellung der Ansicht des Benutzers, und nicht brauchen, um teilzunehmen in der eigentlichen Anzeige - oder haben Sie Kenntnis von Animationen, visual states, etc.
Verwendung einer DataStateBehavior zu ändern visual Staaten basiert auf einer Bindung, die in Silverlight:
Was ich getan habe, in der Vergangenheit ist zu erklären, ein Ereignis in meiner VM, auf die der View abonniert. Wenn dann möchte ich darauf hinweisen, dass die busy-Anzeige sollte verschwinden, Hebe ich die Veranstaltung innerhalb der VM.