2016-10-03 2 views
0

Je suis nouveau sur MVVM et essaie de suivre toutes les instructions que je trouve pour le respecter. Je voudrais avoir une Animation sur un de mes contrôleurs. Je veux l'inclure sur le contrôle comme ça.WPF MVVM Exception lors de l'enregistrement de UserControl dans DataContext

Le Usercontrol il est niché dans apparaît sur l'MainWindow en utilisant un DataTemplate pour un ViewModel, par exemple comme ceci:

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

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

Lors de l'exécution cela, l'application est représentée et je vois aussi la vue pour le AppConfigViewModel qui est lié correctement puisque les valeurs sous-jacentes sont affichées correctement dans la vue.

Maintenant j'ai essayé d'enregistrer le BusyAnimation dans le ViewModel (pour le contrôler à partir de là) en faisant cela dans le constructeur de la BusyAnimation:

(DataContext as PageViewModel).BusyAnim = this; 

Pour une raison DataContext est toujours nul et la le résultat de cette ligne est une exception. Qu'est-ce que je fais mal ici?

+1

Rappelez-vous toujours d'afficher la pile-pile de votre Exception. Où est-il jeté? – ltiveron

+0

L'exception est levée dans le constructeur de BusyAnimation. – Ravior

Répondre

1

Ce que j'ai essayé de faire est contre l'idée de MVVM. J'ai essayé de faire un downcasting d'un objet qui est censé être général.

Une meilleure approche pour la tâche que j'ai essayé de réaliser consiste à implémenter des propriétés de dépendance dans le composant d'animation occupé. Ceux-ci sont destinés à être liés à partir du viewmodel de la vue principalement affichée. De cette façon, l'animation occupée peut être affichée quand une propriété du viewmodel change. Cela pourrait être par exemple un bool avec le nom "working".

c'est le code de propriété de dépendance dans mon animation occupée:

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(); 
    } 
} 

Oui son beaucoup de code, mais je me sens WPF il veut de cette façon. Rappelez-vous que le code ci-dessus se trouve dans le contrôle utilisateur busy-animation et déclenche les fonctions Start() Stop() qui contrôlent les storyboards.

Ci-dessous XAML est dans le contrôle qui utilise le busyanimation, le liant à un viewmodel que le busyanimation doit indiquer arrière-plan de travail pour:

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

Ce ShowBusy la propriété il y a la dépendance de la propriété mis en œuvre ci-dessus. Bien sûr IsBusy du modèle devrait suivre le modèle observable pour que tout fonctionne.

/ps: J'ai documenté toutes les erreurs que j'ai faites et comment je les ai résolues. Puis-je me débarrasser des points négatifs que j'ai obtenus en créant cette question?