Frage

Ich habe festgestellt, dass Datagrid Spalte dynamisch in Silverlight erstellt und gebunden werden. Allerdings kann ich nicht einen Weg finden, Daten zu diesen Spalten zu binden.

Wenn ich versuche, jede Art von Objekt zu binden, mit Autogeneratecolumns = true, dann die Namen der einzelnen Eigenschaften des Objekts hinzugefügt bekommen als Spalten und die Objektinformation wird in dem Netz zusätzlich zu den vorhandenen Spalten angezeigt, die keine Daten zeigen.

Wenn ich eine Liste mit Autogeneratecolumns = false gelten, dann bekomme ich immer noch Zeilen in der Tabelle zu zeigen, aber keine Daten in den Spalten.

Ich möchte nicht auf ein bestimmtes Objekt für jeden Fall zu schaffen, die ich brauche Daten im datagird angezeigt werden soll.

Ich will nicht meine Spaltennamen auf die Namen von Eigenschaften beschränkt zu sein, z.B. Namen, die mit aus Leerzeichen.

Ich möchte in der Lage, eine Liste oder ein Wörterbuch Array an das Datennetz zu binden. Ich möchte auch in der Lage sein, zu kontrollieren, welche Daten zeigt sich, in welchen Spalten.

War es hilfreich?

Lösung

Angenommen, Sie haben eine Klasse oder einen anderen Behälter, die Sie wollen binden Informationen, können Sie die folgenden Aktionen aus.

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

Jetzt nur geben Sie Ihre ItemSource des Datagrid auf die Sammlung von Elementen Sie haben.

Auf diese Weise können Sie den Header Sie anzeigen möchten, setzen, und es bindet auch die Informationen zu den Variablen in dem Behälter, so zeigt es die Informationen nur die Spalten, die Sie hinzufügen.

Andere Tipps

Du bist wahrscheinlich es fast, aber nur etwas subtil falsch in Ihrem XAML haben, hier ist ein funktionierendes Beispiel:

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

    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top