Dans votre XAML lier votre DataGrid à un ObservableCollection d'objets d'une certaine classe qui a des propriétés.
XAML:
<WpfToolkit:DataGrid
x:Name="MyDataGrid"
ItemsSource="{Binding Path=Collection}"
HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended"
CanUserAddRows="False" CanUserDeleteRows="False"
CanUserResizeRows="False" CanUserSortColumns="False"
AutoGenerateColumns="False"
RowHeaderWidth="25" RowHeight="25"/>
Ensuite, vous pouvez créer vos colonnes programme en C#/VBA et lier chaque colonne individuelle à une propriété de la classe à laquelle l'ObservableCollection contient des objets de celui-ci. En ajoutant des objets de la classe, vous ajouterez des lignes à la grille de données. En d'autres termes, chaque objet de la classe dans ObservableCollection sera une ligne et les propriétés de la classe seront les colonnes.
Voici un exemple de la façon dont vous pouvez lier vos colonnes ... programme C#:
ObservableCollection<IData> datagridData = new ObservableCollection<IData>();
Binding items = new Binding();
PropertyPath path = new PropertyPath("Name"); // 'Name' is actually the name of the variable representing the property
items.Path = path;
MyDataGrid.Columns.Add(new DataGridTextColumn()
{
Header = "Names",
Width = 275,
Binding = items
});
//repeat the creation of columns
//...
//- Add some objects to the ObservableCollection
//- Then bind the ItemsSource of the datagrid to the ObservableCollection
datagridData .Add(new Data("Bob", string.Empty));
MyDataGrid.DataContext = new DataModel{ MyData = datagridData };
* Edit: Désolé à ce sujet! Voici comment vous pouvez obtenir la même chose tout en XAML:
<WpfToolkit:DataGrid
x:Name="MyDataGrid"
ItemsSource="{Binding Path=Collection}"
HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended"
CanUserAddRows="False" CanUserDeleteRows="False"
CanUserResizeRows="False" CanUserSortColumns="False"
AutoGenerateColumns="False"
RowHeaderWidth="25" RowHeight="25">
<WpfToolkit:DataGridTextColumn
Header="Names" Width="2*"
Binding="{Binding Path=Name}"/>
<WpfToolkit:DataGridTextColumn
Header="Names" Width="2*"
Binding="{Binding Path=Age}"/>
</WpfToolkit:DataGrid.Columns>
</WpfToolkit:DataGrid>
Edit 2: Voici ce que le code de la ObservableCollection et la classe peut ressembler en C#:
public class DataModel
{
public ObservableCollection<IData> MyData{ get; set; }
}
public interface IData
{
string Name{ get; set; }
string Age{ get; set; }
}
public class Data : IData
{
public Data(string name, string age)
{
Name= name;
Age= age;
}
public string Name{ get; set; }
public string Age{ get; set; }
}
Je suppose que c'est la seule façon, je vais garder la question ouverte pendant un moment, peut-être que quelqu'un va trouver quelque chose, sinon accepter cela. Juste un sidenote: La grille est capable de générer des colonnes supplémentaires automatiquement (propriété AutoGenerateColumns). Mais cela ne fonctionnerait pas ou des listes bien sûr. La question est, est-ce que tout ce qui est contraignant fonctionnerait avec les classes qui parlent? Ou mieux - utilise-t-il la réflexion pour générer les colonnes supplémentaires? Je pourrais créer une classe à la volée pour les données, mais cela peut être encore pire en termes de facilité de maintenance et de lisibilité ... –
Je sais que ce n'est pas idéal ... MV-VM a tellement grandi depuis que ce contrôle a été créé à l'origine Je suis sûr qu'il y aura une version à un moment donné dans le futur qui expose Columns comme un DP. Jusque-là, je suppose que nous devons choisir la solution la plus pragmatique .... acclamations, – kiwipom
Je sais que c'est vieux, mais j'ai remarqué que, selon le système d'exploitation (et peut-être si .Net 4.5 est installé ou non, même en ciblant .Net 4.0), le réglage AutoGenerateColumns = true utilise en fait la réflexion avec Windows 7. Ainsi, vous pouvez renvoyer un IEnumerable