2010-05-03 3 views
1

Dans mon application WPF basée sur MVVM, de nombreux types de ViewModel différents sont chargés dynamiquement dans ContentControls ou ContentPresenters. À cet effet que je dois mettre explictly ce que DataTemplate doit être utilisé en XAML:Visibilité par défaut de DataTemplate pour ContentControls

<ContentControl Content={Binding SomePropertyOfTypeViewModel} ContentTemplate={StaticResource someTemplate} />

Maintenant, mon problème est que le contrôle de contenu affiche l'interface utilisateur de someTemplate même si le ContentControl est lié à rien (c.-à-ViewModel. SomePropertyOfTypeViewModel est null) Existe-t-il un moyen rapide et facile de faire en sorte que tous les ContentControls n'affichent rien s'ils ne sont actuellement liés à rien? Lorsque j'utilise des DataTemplates implicites, tout fonctionne comme prévu. Malheureusement, je ne peux pas utiliser ce mécanisme ici.

Mise à jour:

Ma solution actuelle est d'avoir un supplémentaire bool Visible propriété pour chaque ViewModel qui est exposé comme une propriété dans les ViewModels parents. Il renvoie true uniquement lorsque la propriété n'est pas NULL. La visibilité de ContentControl est liée à cette propriété. ParentViewModel.SomePropertyOfTypeViewModelVisible, ParentViewModel.SomeOtherPropertyOfTypeViewModelVisible ...

<ContentControl Content={Binding SomePropertyOfTypeViewModel} Visibility={Binding SomePropertyOfTypeViewModelVisible, Converter={StaticRresource boolToVisibiltyConverter}}" /> 

Ce n'est pas très satisfaisant parce que je dois maintenir un grand nombre de propriétés supplémentaires.

Répondre

0

L'utilisation d'un TemplateSelector semble être aussi bonne que possible.

0

La définition de la "visibilité" du ContentControl résoudra-t-elle votre problème? Si c'est le cas, dans votre ViewModel, vous pouvez créer une propriété Visibility pour la visibilité du ContentControl à lier. Dans la propriété, vous pouvez vérifier si SomePropertyOfTypeViewModel est null. Lors de la définition de SomePropertyOfTypeViewModel, vous devez également indiquer que la propriété ContentControlVisibility a été modifiée.

<ContentControl Content={Binding SomePropertyOfTypeViewModel} Visibility={Binding ContentControlVisibility} /> 

public Visibility ContentControlVisibility 
    { 
     get 
     { 
      return SomePropertyOfTypeViewModel == null ? Visibility.Collapsed : Visibility.Visible; 
     } 
    } 
+0

C'est exactement ce que j'essayais d'éviter. De cette façon, je devrais introduire des tonnes de nouvelles propriétés bool, une pour chaque ViewModel qui est exposée via une propriété: 'ParentViewModel.Child1Visiible, ParentViewModel.Child2Visible ...' J'espérais obtenir une solution plus générique qui ne nécessiterait pas non plus beaucoup de xaml supplémentaire pour chaque ContentControl – bitbonk

Questions connexes