IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Deux DataContext pour un composant


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut Deux DataContext pour un composant
    Bonjour,

    j'ai développé un composant qui hérite du DataGrid du WPF Toolkit et qui permet de sélectionner des lignes en ajoutant une colonne de checkboxes.
    Le but serait que l'utilisateur l'utilise exactement comme un DataGrid du toolkit.

    Le problème est que la dernière colonne de checkboxes ne correspond à aucune propriété des objets fournis par l'utilisateur; donc pas de binding simple possible.
    Le but étant que l'état des checkboxes soit bindé à un booléen indiquant si oui ou non un objet fourni par l'utilisateur est sélectionné.

    Donc comment établir le lien entre les objets et leur état de sélection ?
    Serait-il possible de binder la dernière colonne à une autre collection d'objets que les autres colonnes ?

    Merci.

  2. #2
    Membre chevronné Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Par défaut
    Salut,
    tu peux hériter aussi de CheckBox et effectuer le travail dans le code-behind de tes classes dérivées.

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Merci de ta réponse mais le but est de ne pas créer autant de classes dérivées qu'il y a d'entités possibles à placer dans la DataGrid.
    L'utilisateur peut donner des types quelquonques, et de plus l'héritage dynamique ne fonctionnera pas si le type est privé.

    La solution actuelle rejoint la tienne : il s'agit de faire implémenter aux objets passés à la DataGrid une interface "ISelectable" qui contient une propriété "Object" et une "IsSelected".
    Ainsi le binding est simple : la dernière colonne se bindant à "IsSelected".
    Même si le binding de cette colonne de sélection est réalisé par le composant automatiquement, cela oblige l'utilisateur à définir lui-même des entités "ISelectable" ce qui rend l'utilisation du composant moins facile.

  4. #4
    Membre chevronné Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Par défaut
    Dans ce cas-là, tu pourrais créer une propriété de dépendance attachée.
    Tu pourras ainsi binder l'état des checkboxes dessus, sans que les entités en question n'implémentent une interface particulière.

  5. #5
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    En effet ça semble pouvoir répondre au problème.

    Juste une précision : selon MSDN il semble que les propriétés attachées soient au niveau XAML, cela signifie t'il que l'utilisateur devra faire une déclaration supplémentaire dans le XAML ?

    Ou bien pourra t'il s'en servir de façon transparente ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <local:MultiSelectionDataGrid
        x:Name="selectionDataGrid"
        ItemsSource="{Binding Path=Datas}"
        IsReadOnly="False"
        AutoGenerateColumns="False"
      >
        <local:MultiSelectionDataGrid.Columns>
          <wpftk:DataGridTextColumn Header="Name" Binding="{Binding Path=Label}" IsReadOnly="True" />
        </local:MultiSelectionDataGrid.Columns>
      </local:MultiSelectionDataGrid>
    ?

  6. #6
    Membre éprouvé Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Citation Envoyé par seriousme Voir le message
    Ou bien pourra t'il s'en servir de façon transparente ainsi :
    ?
    C'es tellement transparent que je comprend pas comment ça marche

    Comment l'utilisateur est-il censé récupérer les lignes selectionnées après ?
    Si le 'IsSelected' est une propriété de tes objets, tu seras obligé d'y faire référence quelque part, soit dans le XAML avec un Binding sur la propriété IsSelected d'une DataGridRow, soit dans le code, en passant par l'interface comme tu le proposes.

    Maintenant, si ta classe dérive de DataGrid, peut-être que tu peux ajouter une propriété SelectedItems (avec un 's', parce que je ne l'ai pas trouvé dans DataGrid ) pour lui faire renvoyer la bonne collection d'objets utlisateur. Tu te colles alors à un comportement 'habituel' pour ce genre de composant, et du coup, tu n'as pas besoin d'un DataContext pour gérer l'état sélectionné d'un item, tu utilises directement la propriété IsSelected des DataGridRow, ou la propriété IsChecked de la CheckBox pour générer la valeur de cette propriété.

  7. #7
    Membre éprouvé Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Bonjour,

    voici un exemple où la selection de la ligne (le IsSelected du DataGridRow) est bindée avec une colonne CheckBox d'une Datagrid.
    Je ne sais pas à quoi ressemble ton composant dérivé, mais tu peux peut-être y glisser un Binding qui ressemble à celui-là ?



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    xmlns:wpftoolkit="http://schemas.microsoft.com/wpf/2008/toolkit">
    <Window.Resources>
    <XmlDataProvider x:Key="TheData" XPath="Personnes">
    <x:XData>
    <Personnes xmlns="">
    <Personne Nom="Marley" Prenom="Bob" />
    <Personne Nom="Thiefaine" Prenom="Hubert-Felix" />
    <Personne Nom="Molko" Prenom="Brian" />
    </Personnes>
    </x:XData>
    </XmlDataProvider>
    </Window.Resources>
    <Grid>
    <wpftoolkit:DataGrid AutoGenerateColumns="False" Margin="0,0,9,0" Name="dataGrid1" ItemsSource="{Binding Source={StaticResource TheData}, XPath=*}" SelectionMode="Extended" >
    <wpftoolkit:DataGrid.Columns>
    <wpftoolkit:DataGridTextColumn Binding="{Binding XPath=@Nom}" Header="Nom" />
    <wpftoolkit:DataGridTextColumn Binding="{Binding XPath=@Prenom}" Header="Prenom" />
    
    <!-- C'est surtout cette ligne là qui est interressante -->
    <wpftoolkit:DataGridCheckBoxColumn Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type wpftoolkit:DataGridRow}}}" />
     
    </wpftoolkit:DataGrid.Columns>
    </wpftoolkit:DataGrid>
    </Grid>
    </Window>
    
    Tiens, d'ailleurs, je viens de voir que le composant DataGrid n'autorise pas un SelectionMode à Multiple, comme les ListBox. C'est dommage.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    bon je vais te donner des solutions qui peuvent etre "tordues"
    moi je vois deux solutions si tu veux pas changer ta classe de base
    la permiere
    tu charge tes éléments dans une collection qui va dans un Add
    construire un autre objet qui content en plus la propriété attache avec un bool
    avec les autres propriétés de tes éléments

    la deuxieme
    tu bind les check box sur un element de ta collection qui fourni une collection de bool (et qui est syncronisé sur la collection d'element

    au final tu n'a que la collection (observable collection) d'elements mais tu dois modifier cette observable collection c'est tout

Discussions similaires

  1. [MFC] Deux vues pour un document
    Par Lark dans le forum MFC
    Réponses: 6
    Dernier message: 15/09/2004, 10h44
  2. [C#] Une seule méthode pour plusieurs composants
    Par niPrM dans le forum Windows Forms
    Réponses: 8
    Dernier message: 01/06/2004, 14h41
  3. besoin d'aide pour le composant DBComboBox
    Par jane2002 dans le forum Bases de données
    Réponses: 8
    Dernier message: 28/02/2004, 19h01
  4. [SOCKET C] deux send() pour un recv()
    Par trois_1 dans le forum Développement
    Réponses: 4
    Dernier message: 01/12/2003, 19h13
  5. Réponses: 4
    Dernier message: 06/11/2003, 10h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo