2013-04-08 2 views
1

Je réécris une application WPF pour utiliser Caliburn.Micro. L'application est un système de menu qui affiche les dossiers, puis les fichiers dans ces dossiers. Le problème est que je dois permettre à l'utilisateur de basculer vers un mode "Admin" qui permettra des options supplémentaires. J'ai actuellement un FolderView et FileView avec ViewModels pour chacun. Je pensais avoir un FolderAdminView et un FileAdminView séparés afin que je puisse changer l'IU et activer les options supplémentaires. Le problème est de basculer entre les deux lorsque l'utilisateur change de mode.Activer l'affichage du mode administrateur dans caliburn.micro

Un FolderViewModel et un FileViewModel peuvent tous deux être chargés en même temps, de sorte qu'un appel à DeactivateItem(ActiveItem, true); agira comme un bouton de retour et reviendra à la vue de dossier.

Je voudrais également reporter les valeurs du FolderViewModel au FolderAdminViewModel, car la principale différence est l'interface utilisateur.

Existe-t-il un moyen facile d'échanger des éléments dans le WindowManager ou un moyen plus simple de le faire? Pourrais-je avoir un ViewModel mais deux Views? Existe-t-il un moyen d'avoir les deux modèles dans une vue et d'y sélectionner la bonne?

Répondre

1

Ne pouvez-vous pas simplement avoir une propriété IsAdmin sur votre ViewModel et lier la visibilité de vos éléments d'administration à celle utilisant un BooleanToVisibilityConverter?

ViewModel

public bool IsAdmin 
{ 
    get 
    { 
     //What ever you do to work out if user is admin 
     //omitted any INotifyPropertyChanged gubbins 
    } 
} 

Xaml

<StackPanel Visibility="{Binding IsAdmin,Converter={StaticResource BooleanToVisibiltyConverter}}"></StackPanel> 

Converter

public sealed class BooleanToVisibilityConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var flag = false; 
      if (value is bool) 
      { 
       flag = (bool)value; 
      } 
      else if (value is bool?) 
      { 
       var nullable = (bool?)value; 
       flag = nullable.GetValueOrDefault(); 
      } 
      if (parameter != null) 
      { 
       if (bool.Parse((string)parameter)) 
       { 
        flag = !flag; 
       } 
      } 
      return flag ? Visibility.Visible : Visibility.Collapsed; 
     } 
     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var back = ((value is Visibility) && (((Visibility)value) == Visibility.Visible)); 
      if (parameter != null) 
      { 
       if ((bool)parameter) 
       { 
        back = !back; 
       } 
      } 
      return back; 
     } 
    } 
+0

Comment pourrais-je lier revenir à la propriété IsAdmin sur le ViewModel de chaque élément dans un IObeservableCollection dans un ItemsControl? – AdmSteck

0

Vous pouvez utiliser le 'contexte' propriété attaché à préciser le contexte pour toutes les vues qui sont chargés par exemple:

<ContentControl x:Name="SomeSubViewModel" cal:View.Context="SomeContext" /> 

CM utilise ToString() sur l'objet de contexte pour obtenir une valeur qu'il utilisera pour générer le nom de type pendant la résolution de la vue. Cela signifie que vous pouvez avoir plusieurs vues pour le même viewmodel et donc ajouter des fonctions supplémentaires lorsque l'utilisateur est en mode administrateur en liant la propriété View.Context

Vous pouvez également créer une liaison pour chaque élément que vous souhaitez masquer dans le viewmodel et utiliser un convertisseur pour vérifier si l'utilisateur est connecté etc - évidemment cela dépend si vous voulez dupliquer le XAML dans deux vues ou avoir une seule vue avec la logique conditionnelle pour cacher/montrer des secteurs

Lisez sur la propriété de contexte:

http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Conventions&referringTitle=Documentation

le lien ci-dessus présente quelques exemples (dans les premières sections)

et ici:

http://caliburnmicro.codeplex.com/wikipage?title=Screens%2c%20Conductors%20and%20Composition

dans les Vues multiples sur la même section ViewModel

Questions connexes