2011-10-04 5 views
3

Tout d'abord je veux excuser mon anglais. Ce que je veux réaliser semble très simple mais je suis un peu perdu dans la mise en œuvre.ToggleButtons dans ItemsControl lié à une ObservableCollection

Contexte: J'ai une collection observable de contacts. ces contacts ont tous 1 ou plusieurs ContactRoles. Je lie les contacts à la source d'éléments d'un ItemsControl et je veux qu'un ToggleButton pour chaque rôle dans le contact soit affiché.

Question: Ma première question est comment puis-je aller d'une liste de contacts avec des rôles à un grand nombre de ToggleButtons à l'écran. La deuxième question que j'ai est si je clique sur un ToggleButton tous les autres boutons qui ont le même contact doivent être vérifiés aussi bien. Si je clique sur un autre bouton à bascule appartenant à un autre contact, tous les boutons cochés doivent être décochés et les boutons appartenant au nouveau contact doivent être vérifiés.

Que dois-je maintenant: Ce que j'est maintenant un ItemsControl dans un ItemsControl et ItemsControl interne, il est itemtemplate est l'impression des ToggleButtons regardent un code ci-dessous:

<Button Content="Add" Width="72" Height="27" Command="{Binding Path=AddContact}" VerticalAlignment="Top"/> 
      <ItemsControl ItemsSource="{Binding Path=Contacts}" IsTabStop="False" Name="Parent"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <WrapPanel /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <ItemsControl ItemsSource="{Binding ContactRoles}"> 
          <ItemsControl.ItemsPanel> 
           <ItemsPanelTemplate> 
            <WrapPanel /> 
           </ItemsPanelTemplate> 
          </ItemsControl.ItemsPanel> 
          <ItemsControl.ItemTemplate> 
           <DataTemplate> 
            <ToggleButton Content="{Binding}" CommandParameter="{Binding ElementName=Parent, Path=DataContext.Item}" Template="{StaticResource toggleButtonTemplateButtonBar}" 
             Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ViewContact}" Height="27" MinWidth="100"> 

            </ToggleButton> 
           </DataTemplate> 
          </ItemsControl.ItemTemplate> 
         </ItemsControl> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 

Cette partie du code est en train de montrer. J'espère que quelqu'un peut m'aider avec ça.

D'autres questions que j'ai est Dois-je faire un contrôle personnalisé qui hérite de ItemsControl ou cela peut-il être fait par des modèles et des styles?

Si vous avez besoin de plus d'informations faites le moi savoir.

Merci, Jordy

EDIT:

Je suis désolé, je n'étais pas si claire à formuler mes questions. pour revenir sur vous commenter. La ItemsSource du premier ItemsControl contient une liste avec des contacts uniques, la ItemsSource de la seconde contient une liste de chaînes (rôles) appartenant à ce contact. Je veux montrer un ToggleButton pour chaque rôle de tous les contacts. Mais je pense que vous avez invité cela à partir de mon codeexample.

Some more information

Cette image montre ce que je suis en train de faire. J'espère que cela rend la chose plus claire.

+2

Il n'est pas si clair quels problèmes vous avez avec votre code actuel. Il semble afficher correctement les rôles de contact. En ce qui concerne votre deuxième scénario (lorsque vous décochez quelque chose), il sera plus facile de comprendre ce que vous voulez réaliser si vous fournissez un exemple de scénario – Snowbear

Répondre

0

Comme Snowbear dit s'il vous plaît fournir plus d'entrées ... A partir de vos questions que je vois ...

Ma première question est de savoir comment puis-je passer d'une liste de contacts avec des rôles à beaucoup de ToggleButtons sur écran.

Que voulez-vous dire par GO? Demandez-vous comment sont transformés Contacts ou Contact.Roles en ToggleButtons? Alors c'est ce que fait votre ItemTemplate. Si vous souhaitez que certaines propriétés ou données de l'objet Contact soient conservées par le bouton bascule, vous avez déjà utilisé Binding dans votre ItemTemplate.

 <ToggleButton Content="{Binding}" Tag="{Binding Roles}"> 
     </ToggleButton> 

Dans l'exemple ci-dessus, Tag qui est l'une des propriétés non visuelles de FrameworkElement s en WPF, est lié à la liste des Roles de l'objet Contact correspondant.

La deuxième question est si je clique sur un ToggleButton tous les autres boutons qui ont le même contact doivent être vérifiés aussi bien.

Voulez-vous dire que dans votre liste de Contacts un objet Contact est ajouté à plusieurs reprises dans la liste? Si c'est le cas, la conception est mauvaise et peut causer des erreurs en utilisant ItemsSource. Si non, alors cette déclaration de votre all other buttons that have the **same contact** est confuse. Voulez-vous dire que vous avez des contacts qui peuvent répéter mais ils ne sont pas le même objet par référence. Ils partagent probablement une certaine valeur d'identification, par ex. ils ont même Contact.Name ou Contact.ID etc.

Si une valeur identifiant de contact est ce qui est même entre les différents objets de contact alors vous devrez utiliser intelligemment la SelectedValue obligatoire.

Si je clique sur un autre togglebutton qui appartiennent à un autre contact tous les boutons vérifié doit être cochée et les boutons appartenant au nouveau contact doit être cochée.

Encore une fois cela est possible une fois que vous décidez ce que vous essayez vraiment faire dire que vous ajoutez même objet Temps de contact multiple ou vous avez différents Contact objets ayant une certaine value commune. Dois-je créer un contrôle personnalisé qui hérite de ItemsControl ou est-ce que cela peut être fait par des modèles et des styles? Dans WPF, il est possible d'OBTENIR TOUT ce qui est nécessaire en utilisant des modèles et des styles courants. Ils éliminent définitivement le besoin de créer un contrôle personnalisé pour différents contrôles visuellement similaires. Mais si vous contrôlez un comportement ou une fonctionnalité que vous devez exécuter exactement de la même manière à plusieurs endroits et que vous voulez qu'il soit scellé et qu'il se limite à exécuter cette fonction spécifique, il est logique de créer un contrôle personnalisé.

Veuillez donc reformuler votre question et fournir des entrées plus claires.

Questions connexes