Bonjour,

J'utilise WPFToolKit pour pouvoir exploiter un DataGrid.
Je dispose de différentes classes dont certains membres peuvent être des collections. Je voudrais afficher une liste d'objets d'une même classe dans le DataGrid.

Si je garde la propriété AutoGenerateColumns à True. Les colonnes générées sont des DataGridTextColumn pour afficher les collections.
Donc, pour afficher le contenu de ces collections, je change le style de cellule afin quelles contiennent un ComboBox. Je profite de l'évenement AutoGeneratingColumn pour le faire.
Le ComboBox est défini dans un DataTemplate. Mais voilà le problème : Je n'arrive pas à indiquer quelle est la collection à parcourir par le ComboBox.
Sachant que n'importe quelle classe peut être affichée, je ne tiens pas à indiquer un noms de membre précis.


Voici un exemple simple :
Xaml:
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
 
<Window x:Class="WpfEssais.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid x:Name="layoutRoot">
        <Grid.Resources>
 
            <DataTemplate x:Key="CollectionData"  >
                <ComboBox ItemsSource="{Binding ???}" ></ComboBox>
            </DataTemplate>
 
            <Style x:Key="dgCell" TargetType="dg:DataGridCell">
                <Setter Property="ContentTemplate" Value="{StaticResource CollectionData}"/>
            </Style>
 
        </Grid.Resources>
 
        <dg:DataGrid x:Name="dg" ItemsSource="{Binding}" AutoGeneratingColumn="dg_AutoGeneratingColumn" IsReadOnly="True" ></dg:DataGrid>
    </Grid>
</Window>
Code behind:
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
32
33
34
35
36
37
38
39
40
41
42
 
using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;
 
namespace WpfEssais
{
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            List<elm> l = new List<elm>();
            l.Add(new elm { Nom = "Fou", Choses = new string[] { "Pinceau", "Echelle" }});
            l.Add(new elm { Nom = "Henri IV", Choses = new string[] { "Cheval", "Pot" } });
            dg.DataContext = l;
        }
 
        private void dg_AutoGeneratingColumn(object sender, Microsoft.Windows.Controls.DataGridAutoGeneratingColumnEventArgs e)
        {
            if (e.PropertyType.IsArray)
            {
                e.Column.CellStyle = (Style)layoutRoot.Resources["dgCell"];
            }
        }
 
    }
 
    public class elm
    {
        public string Nom { get; set; }
        public string[] Choses { get; set; }
 
    }
}
Dans la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<ComboBox ItemsSource="{Binding ???}" ></ComboBox>
est-il possible de se référer à un element ancêtre afin de pouvoir rester dans des termes génériques et éviter de donner un nom de collection membre de la classe bindée au DataGrid. Et comment faire ?

Par avance merci.
Luis