Question

J'ai constaté que les colonnes de la grille de données peuvent être créées et liées dynamiquement dans Silverlight. Cependant, je ne trouve pas de moyen de lier des données à ces colonnes.

Si j'essaie de lier n'importe quel type d'objet avec AutoGenerateColumns = true, les noms de chaque propriété de l'objet sont ajoutés en tant que colonnes et les informations sur l'objet sont affichées dans la grille en plus des colonnes existantes qui ne contiennent aucune donnée.

Si j'applique une liste avec AutoGenerateColumns = false, les lignes apparaissent toujours dans la table, mais aucune donnée dans les colonnes.

Je ne souhaite pas créer d'objet spécifique pour chaque cas nécessitant l'affichage de données dans le datagird.

Je ne veux pas que mes noms de colonnes soient limités aux noms de propriétés, par exemple. noms sans espaces.

Je veux pouvoir lier une liste ou un tableau de dictionnaire à la grille de données. Je veux aussi pouvoir contrôler quelles données apparaissent dans quelles colonnes.

Était-ce utile?

La solution

Supposons que vous souhaitiez lier des informations à une classe ou à un autre conteneur, vous pouvez procéder comme suit.

DataGridTextColumn product = new DataGridTextColumn();
                product.Binding = new System.Windows.Data.Binding("Product");
                product.Header = "Product";

                DataGridTextColumn date = new DataGridTextColumn();
                date.Binding = new System.Windows.Data.Binding("Date");
                date.Header = "Date";

                DataGridTextColumn version = new DataGridTextColumn();
                version.Binding = new System.Windows.Data.Binding("FileVersion");
                version.Header = "Version";

                DataGridTextColumn timestamp = new DataGridTextColumn();
                timestamp.Header = "TimeStamp";
                timestamp.Binding = new System.Windows.Data.Binding("TimeStamp");

                DataGridTextColumn user = new DataGridTextColumn();
                user.Header = "User";
                user.Binding = new System.Windows.Data.Binding("User");

                rpdata.Columns.Add(product);
                rpdata.Columns.Add(date);
                rpdata.Columns.Add(version);
                rpdata.Columns.Add(timestamp);
                rpdata.Columns.Add(user);

Définissez simplement votre source d’articles de la grille de données sur la collection d’éléments que vous possédez.

Ceci vous permet de définir l'en-tête que vous souhaitez afficher et de lier les informations aux variables du conteneur. Il affiche donc uniquement les informations des colonnes que vous avez ajoutées.

Autres conseils

Vous y êtes probablement presque mais il y a juste quelque chose qui cloche dans votre xaml, voici un exemple pratique:

<UserControl x:Class="Testproject.EditableDataGrid"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <data:DataGrid x:Name="myDataGrid" AutoGenerateColumns="False"> 
            <data:DataGrid.Columns>
                <data:DataGridTextColumn Header="My text" Binding="{Binding StringValue}" />
                <data:DataGridCheckBoxColumn Header="Check Box" Binding="{Binding IsChecked}" />
                <data:DataGridTemplateColumn Header="A template column">
                    <data:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Rectangle Width="20" Height="5" Fill="Red"/>
                            <TextBlock Text="{Binding IntValue}" />
                        </StackPanel>
                    </DataTemplate>
                </data:DataGridTemplateColumn.CellTemplate>

            </data:DataGridTemplateColumn>
                <data:DataGridTextColumn Header="My int" Binding="{Binding IntValue}" />
            </data:DataGrid.Columns>
        </data:DataGrid>
    </Grid>
</UserControl>

using System.Windows;
using System.Windows.Controls;
using System.Collections.Generic;

namespace Testproject
{
    public partial class EditableDataGrid   :UserControl
    {
        public EditableDataGrid()
        {
            InitializeComponent();

            myDataGrid.ItemsSource = new List<ClassForDataGridTest>()
                            {
                                new ClassForDataGridTest() {StringValue="hello", IntValue=21, IsChecked=false}
                                , new ClassForDataGridTest() {StringValue="the second", IntValue=122, IsChecked = true}
                            };
        }
    }

    public class ClassForDataGridTest   : DependencyObject
    {

        public string StringValue {get; set;}

        public int IntValue {get; set;}

        public bool IsChecked { get; set; }

    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top