2009-11-06 5 views
9

J'ai un ListBox montrant des données sur des employés tels que le nom, la photo de département, le nombre de badge, etc. Les employés peuvent avoir différents types tels que le directeur, le personnel, les volontaires. J'ai 3 modèles de données séparés - un pour chaque type. Tous ces modèles montrent essentiellement les mêmes données mais présentés différemment.WPF - Paramètres de DataTemplates?

Selon l'utilisateur connecté aux images de l'application, le numéro de badge, etc., peut ou non être visible. Donc, j'ai des propriétés booléennes pour cela - CanSeePhotos, CanSeeBadgeNumbers, etc. Donc, si CanSeePhotos == false, tous les modèles de données doivent cacher les photos.

Ma question est, comment puis-je utiliser ces propriétés booléennes dans mes modèles de données pour basculer la visibilité des éléments appropriés? Est-il possible de transmettre des paramètres aux modèles de données lorsque je les renvoie depuis mon TemplateSelector?

Merci!

modifier: après l'idée de Ray, je fini par faire ceci:

Visibility="{Binding Source={x:Static local:Global.CanSeePhoto}, Converter={StaticResource BooleanToVisibilityConverter}}" 

Répondre

4

En fait, il y a un moyen de personnaliser DataTemplates car ils sont renvoyés de la TemplateSelector en les enveloppant dans un FrameworkElementFactory, mais il est beaucoup trop complexe pour vos besoins.

Pour votre cas, il existe deux solutions qui sont beaucoup plus faciles: les déclencheurs et les convertisseurs.

Déclencheurs

Vous pouvez utiliser un déclencheur à l'intérieur du DataTemplate. Par exemple, donnez au TextBox ou au Panel où vous affichez le numéro de badge un x: Name, puis créez un DataTrigger sur la propriété CanSeeBadgeNumebers. Ajoutez un setter au DataTrigger et définissez la propriété Visible sur Caché ou Réduit, en le référençant par son nom.

idée de base:

<DataTemplate> 
    ... 
    <DockPanel x:Name="BadgeNumberPanel"> 
    <Label ... /> 
    <TextBox ... /> 
    </DockPanel> 
    ... 

    <DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding CanSeeBadgeNumbers}" Value="true"> 
     <Setter ElementName="BadgeNumberPanel" Property="Visibility" Value="Collapsed" /> 
    </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

Convertisseurs

Vous pouvez créer un IValueConverter dans le code qui convertit le type "bool" type "de visibilité" (il existe de nombreux exemples que vous pouvez là couper et coller), puis lier la visibilité du TextBox à CanSeeBadgeNumbers, en utilisant le convertisseur.

<DockPanel Visibility="{Binding CanSeeBadgeNumbers, Converter="{x:Static local:BoolToVisibilityConverter.Instance}}"> 
    <Label ... /> 
    <TextBox ... /> 
</DockPanel> 

comment je le fais

J'utilise en fait une technique différente pour mon propre code: Ma fondation de données comprend un MarkupExtension j'ai écrit qui appelle mon noyau C# analyseur d'expression, donc je peux dire quelque chose comme

Visibility="{edf:Visibility CanSeeBadgeNumber || Owner.SecurityLevel.Count() > 3}" 

Malheureusement, ma base de données n'a pas encore été publiée. Quand c'est le cas, je prévois de le rendre gratuit et open source, mais c'est dans quelques mois encore.

+1

Si votre CanSeeBadgeNumber n'est pas une propriété des données mais de l'environnement, vous devrez peut-être ajouter quelque chose comme Source = "{x: Static UserInfo.CurrentUser}" à votre liaison. C'est la même chose que vous utilisiez des déclencheurs ou des convertisseurs. –

+1

Expressions dans les liaisons XAML! Cela fait longtemps que j'attends ça - ça me manque vraiment depuis mes Flex Days. Au plaisir de le voir! – Grokys

+4

Alors, l'avez-vous déjà sorti? – BrainSlugs83

Questions connexes