2016-10-03 2 views
0

Ich bin neu in MVVM und versuchen, alle Richtlinien zu befolgen, die ich finde, um es zu respektieren. Ich möchte eine Busy-Animation auf einer meiner Benutzersteuerungen haben. Ich möchte es so in die Steuerung einbeziehen.WPF MVVM Ausnahme bei der Registrierung von UserControl in DataContext

Die Usercontrol es verschachtelt ist in auf dem Hauptfenster gezeigt, die eine Datatemplate für ein Ansichtsmodell, zum Beispiel wie so mit:

<Window.Resources> 
    <DataTemplate DataType="{x:Type AppViews:AppConfigViewModel}"> 
     <local:AppConfigView /> 
    </DataTemplate> 
</Window.Resources> 

<Grid> 
    <ContentControl Content="{Binding CurrentPageViewModel}" /> 
</Grid> 

Wenn dies ausgeführt wird, wird die Anwendung gezeigt und ich auch sehen die Ansicht für das AppConfigViewModel, das korrekt gebunden wird, da die zugrunde liegenden Werte in der Ansicht korrekt angezeigt werden.

Jetzt habe ich versucht, die BusyAnimation im Ansichtsmodell zu registrieren (es von dort aus steuern), indem diese von der BusyAnimation im Constructor tun:

(DataContext as PageViewModel).BusyAnim = this; 

Aus irgendeinem Grunde die Datacontext ist immer null und die Das Ergebnis dieser Zeile ist eine Ausnahme. Was mache ich hier falsch?

+1

Bitte denken Sie immer daran, den Stacktrace Ihrer Exception zu posten. Wo wird es geworfen? – ltiveron

+0

Die Exception wird im Konstruktor der BusyAnimation ausgelöst. – Ravior

Antwort

1

Was ich versucht habe zu tun, ist gegen die Idee von MVVM. Ich habe versucht, ein Objekt herunterzufahren, das allgemein sein soll.

Ein besserer Ansatz für die Aufgabe, die ich versuchte, ist die Implementierung von Abhängigkeitseigenschaften in der ausgelasteten Animationskomponente. Diese sind an das Ansichtsmodell der hauptsächlich angezeigten Ansicht gebunden. Auf diese Weise kann die ausgelastete Animation angezeigt werden, wenn sich eine Eigenschaft im Viewmodel ändert. Das könnte zum Beispiel ein Bool mit dem Namen "arbeiten" sein.

dies ist die Abhängigkeitseigenschaft Code in meinem beschäftigt Animation:

public static readonly DependencyProperty ShowBusyProperty = DependencyProperty.Register("ShowBusy", typeof(Boolean), typeof(FortschrittView), new PropertyMetadata(false, OnShowBusyPropertyChanged)); 
public Boolean ShowBusy 
{ 
    get { return (Boolean)this.GetValue(ShowBusyProperty); } 
    set { this.SetValue(ShowBusyProperty, value); } 
} 

private static void OnShowBusyPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
{ 
    FortschrittView myUserControl = dependencyObject as FortschrittView; 
    myUserControl.OnPropertyChanged("ShowBusy"); 
    myUserControl.OnShowBusyPropertyChanged(e); 
} 
private void OnShowBusyPropertyChanged(DependencyPropertyChangedEventArgs e) 
{ 
    if(ShowBusy) 
    { 
     Start(); 
    } 
    else 
    { 
     Stop(); 
    } 
} 

Ja, es ist eine Menge Code, aber ich fühle mich wpf es so will. Erinnern Sie sich daran, dass sich der obige Code im Benutzersteuerelement "busy-animation" befindet und Star() Stop() - Funktionen auslöst, die Storyboards steuern.

Unten XAML ist in der Steuerung, die die busyanimation verwendet, um es zu einem Viewmodel Bindung, die die busyanimation sollte für Hintergrund-Arbeit zeigen:

<local:BusyAnimation ShowBusy="{Binding Model.IsBusy}"/> 

Des ShowBusy Property gibt es die Abhängigkeitseigenschaft oben umgesetzt. Natürlich sollte IsBusy aus dem Modell dem beobachtbaren Muster folgen, damit alles funktioniert.

/ps: Ich dokumentierte ausführlich die Fehler, die ich tat und wie ich sie löste. Kann ich die negativen Punkte loswerden, die ich irgendwie bekommen habe, um diese Frage zu stellen?

Verwandte Themen