Domanda

Ho scoperto che le colonne datagrid possono essere create e associate dinamicamente in Silverlight. Tuttavia, non riesco a trovare un modo per associare i dati a quelle colonne.

Se provo a associare qualsiasi tipo di oggetto con AutoGenerateColumns = true, i nomi di ciascuna proprietà dell'oggetto vengono aggiunti come colonne e le informazioni sull'oggetto vengono visualizzate nella griglia in aggiunta alle colonne esistenti che non mostrano dati.

Se applico un elenco con AutoGenerateColumns = false, ottengo comunque righe da mostrare nella tabella ma nessun dato nelle colonne.

Non voglio creare un oggetto specifico per ogni caso di cui ho bisogno per visualizzare i dati nel datagird.

Non desidero che i nomi delle mie colonne siano limitati ai nomi delle proprietà, ad es. nomi senza spazi.

Voglio essere in grado di associare un elenco o un array di dizionari alla griglia dei dati. Voglio anche essere in grado di controllare quali dati vengono visualizzati in quali colonne.

È stato utile?

Soluzione

Supponi di avere una classe o qualche altro contenitore a cui desideri associare informazioni, puoi fare quanto segue.

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);

Adesso imposta la tua fonte di oggetti del datagrid sulla raccolta di oggetti che hai.

Ciò consente di impostare l'intestazione che si desidera visualizzare e inoltre lega le informazioni alle variabili nel contenitore, quindi visualizza le informazioni delle sole colonne aggiunte.

Altri suggerimenti

Probabilmente ci sei quasi ma hai qualcosa di leggermente sbagliato nel tuo xaml, ecco un esempio funzionante:

<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; }

    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top