2009-10-09 7 views
0

J'essaie de créer un modèle d'élément où une partie du champ de mon panneau de pile peut être vide. Quand il est vide, je voudrais mettre la visiblilité à s'effondrer. J'ai essayé de mettre des déclencheurs mais cela ne semble pas fonctionner et je ne suis pas très familier avec cette partie de WPFProblème avec ItemTemplate TextBlock

Aussi, je voudrais changer la couleur de l'arrière-plan de cet article quand une valeur spécifique dans ma liaison est vrai. Est-ce la même chose?

Merci.

Répondre

1

L'utilisation d'un ViewModel est une approche pour résoudre ce genre de problème.

Si vos données étaient stockées dans une classe Item, vous créeriez un ItemViewModel pour envelopper l'élément dans votre contrôle d'éléments. La classe ViewModel implémenterait INotifyProperty modifié afin de mettre à jour l'affichage et les setters déclencheraient l'événement PropertyChanged en transmettant le nom de propriété approprié. Vous pouvez également déclencher des événements modifiés de propriété pour autant de champs modifiés interdépendants que nécessaire. Supposons que vous vouliez que Item.Description s'affiche dans un champ réduit lorsque la description est vide. Vos propriétés ViewModel pourrait ressembler à ceci

public string Description 
{ 
    get { return mItem.Description; } 
    set { mItem.Description = value; Notify("Description"); Notify("DescriptionVisibility"); } 
} 

public Visibility DescriptionVisibility 
{ 
    get { return string.IsNullOrEmpty(mItem.Description) ? Visibility.Visible : Visibility.Collapsed; } 
} 

Dans le XAML lier la propriété de texte à la description et la propriété de visibilité à DescriptionVisibility.

+0

J'aime cette idée. Comme j'utilise un objet personnalisé, je pourrais facilement définir de nouvelles propriétés en lecture seule et définir cette information. Merci –

0

Si vous souhaitez masquer un élément si son contenu est nul, vous devez redéfinir le ControlTemplate de son ListBoxItem (ou ListViewItem ou quelque chose d'autre en fonction du conteneur élément que vous utilisez) et utiliser des déclencheurs qui ciblent le DataContext, comme:

<DataTrigger Binding="{Binding}" Value="{x:Null}"> 
    <Setter Property="Visibility" Value="Collapsed" /> 
</DataTrigger> 

Cependant, je vous suggère d'utiliser le délégué Filter sur votre CollectionView pour exclure vos articles vides de votre point de vue directement, afin d'éviter l'effondrement des éléments inutilisés.

Par exemple, pour exclure les objets nuls, dans votre code derrière, utilisez:

CollectionViewSource.GetDefaultView(yourCollection).Filter = o => o != null; 
+0

Le fait est que je ne veux pas cacher tout l'article, juste une partie du modèle qui est vide à certaines occasions. –

Questions connexes