2010-08-13 5 views
0

Est-il possible de lier deux données différentes à la même colonne DataGrid. Dites si j'ai la classe A qui a la propriété p1 et j'ai une autre classe B avec la propriété p2. Est-il possible de lier p1 et p2 à la même colonne de DataGrid?Liaisons multiples à la colonne DataGrid

Répondre

1

Quelque chose comme ceci:

<StackPanel> 
    <TextBlock Text="{Binding ClassAProperty}"/> 
    <TextBlock Text="{Binding ClassBProperty}"/> 
</StackPanel> 

fonctionnera, tant que les classes ne possèdent pas de propriétés avec le même nom. Mais c'est une sorte de hack laid, et bonne chance de trouver des erreurs de liaison réelles parmi toutes les fausses erreurs de liaison que cette approche va générer.

Le mappage des propriétés de chaque type sur des colonnes doit être installé quelque part, mais il n'est pas nécessaire de le faire en XAML, et ce n'est pas ce que je dirais. Je le ferais dans mon modèle de vue. En supposant que je n'ai pas déjà vue classes de modèle pour mes objets ClassA et ClassB (et que je ne veux pas les créer), je mettre en œuvre quelque chose comme ceci:

public class DataGridHelper 
{ 
    public Wrapper(object o) 
    { 
     ClassA a = o as ClassA; 
     if (a != null) 
     { 
     Column1 = a.Property1; 
     Column2 = a.Property2; 
     ... 
     } 

     ClassB b = o as ClassA; 
     if (b != null) 
     { 
     Column1 = b.Property1; 
     Column2 = b.Property2; 
     ... 
     } 

     public object Column1 { get; private set; } 
     public object Column2 { get; private set; } 
} 

... puis lier les colonnes DataGrid à une collection d'objets DataGridHelper.

Si je ne ont cours ClassAViewModel et ClassBViewModel, je venais de mettre en œuvre Column1, Column2, propriétés, etc. dans les deux. Ce serait la voie à suivre si j'avais besoin de prendre en charge la liaison bidirectionnelle et la validation.

+0

Yea StackPanel est en désordre. Créer un DataGridHelper ressemble au chemin à parcourir. Merci! – Reflux

2

Vous pouvez utiliser une colonne DataGridTemplate qui contiendrait deux contrôles différents, chacun lié à une propriété différente.

1

Le moyen le plus simple de le faire est probablement un MultiBinding. Voici un simple example sur la façon d'utiliser MultiBinding (qui tire parti de la propriété StringFormat, que j'aime).

Questions connexes