web-dev-qa-db-fra.com

WPF: comment lier à un seul élément dans une collection, sans utiliser ItemsControl car je ne veux pas les afficher tous

J'ai cette exigence, que j'ai une collection d'articles (ObservableCollection), mais je veux seulement afficher le premier article. L'exigence vient du fait que dans la plupart des cas, la collection ne contient qu'un seul article. Et en raison de l'espace limité, même s'il y a plus d'un article dans la collection, nous aimerions afficher le nombre d'articles, les détails du premier (même présentation que la situation précédente) et un ... symbole pour indiquer à l'utilisateur qu'il y a plus d'articles. Et lorsque la souris survole l'élément d'interface utilisateur, une fenêtre contextuelle affiche éventuellement tous les éléments.

La première solution à laquelle je peux penser (veuillez en suggérer d'autres si elles sont meilleures) est de lier à cette collection (mais sans utiliser de ItemsControl) et de définir une classe dérivée DataTemplateSelector (qui retourne soit le DataTemplate pour afficher le seul élément, ou le DateTemplate qui a le ... et la fenêtre contextuelle pour plus de détails, en fonction du nombre d'éléments de la collection) et utilisez-la comme ContentTemplateSelector.

Mais maintenant, ma question: à quoi ressembleraient mes deux DataTemplate en XAML, afin qu'ils ne puissent afficher que le premier élément de la collection? Évidemment, je ne peux pas avoir un ItemsControl.

METTRE À JOUR:

Maintenant, j'ai réussi à le faire fonctionner et je suis d'accord pour que cette question puisse être fermée (je ne peux plus la supprimer car il y a déjà des réponses).

En fait, je savais comment me lier à un certain élément de la collection, mais ce n'est pas là que je suis confus. J'ai pensé que je devrais utiliser ContentControl comme une réponse le suggère. Mais j'ai pensé que je devais me lier à toute la collection (pas à un seul élément indexé) et utiliser un DataTemplateSelector pour sélectionner le bon DataTemplate en fonction du nombre d'éléments dans la collection. Le code ressemblerait à ceci:

<ContentControl Content="{Binding MyCollection}"
          ContentTemplateSelector="{StaticResource MyTemplateSelector}" />

Et dans MyTemplateSelector je ne savais pas trop comment l'utiliser car il n'y a aucune référence à ma collection car elle est définie comme ressource et elle n'a pas les informations de MyCollection. Cependant, il s'est avéré être très simple, le DataTemplate peut faire référence à un élément indexé sans connaître le nom ou toute autre référence. Tout simplement comme ceci:

<DataTemplate>
   <TextBlock Text="{Binding [0].PropertyName}" />
<DataTemplate />
16
tete

Pour lier à un seul élément d'une collection, vous pouvez utiliser la syntaxe suivante:

{Binding Items[0]}

Ou pour lier à une propriété d'un élément unique de la collection:

{Binding Items[0].Property}

Vous pouvez en savoir plus sur la syntaxe du chemin de propriété à partir de la page Binding.Path Property sur MSDN ... à partir de la page liée:

• Les indexeurs d'une propriété peuvent être spécifiés entre crochets après le nom de la propriété où l'indexeur est appliqué. Par exemple, la clause Path=ShoppingCart[0] définit la liaison à l'index qui correspond à la façon dont l'indexation interne de votre propriété gère la chaîne littérale "0". Plusieurs indexeurs sont également pris en charge.

28
Sheridan

Essaye ça

<ContentControl Content="{Binding YourCollection[0]}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"></TextBlock>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>
9
Nitesh

Ok, tard pour la fête mais j'ai pensé que je partagerais mes 2 cents quand même: je ferais mieux d'aller avec une vue plus stupide (XAML-) et un modèle de vue plus proche de vos besoins de présentation.

Traduit: au lieu de mapper votre modèle de vue existant (ou données brutes) et sa collection d'éléments directement à la vue, je suggère de mapper cela à un modèle de vue approprié montrant quelque chose comme un YourItemViewModel FirstItem propriété et un bool HasMore propriété. Ce deuxième modèle de vue serait facilement testable à l'unité pour s'assurer qu'il se comporte correctement et serait facilement mappé à une vue avec moins de logique, afin d'éviter d'éventuels problèmes difficiles à tester.

3
superjos