Как вручную добавить данные в DataGrid в Silverlight

Я обнаружил, что столбцы таблицы данных можно динамически создавать и связывать в Silverlight. Однако я не могу найти способ привязать данные к этим столбцам.

Если я попытаюсь связать любой тип объекта с AutoGenerateColumns = true, тогда имена каждого свойства объекта будут добавлены в виде столбцов, и информация об объекте будет отображаться в сетке в дополнение к существующим столбцам, которые не показывают данных.

Если я применяю список с AutoGenerateColumns = false, тогда я все равно получаю строки для отображения в таблице, но без данных в столбцах.

Я не хочу создавать определенный объект для каждого случая, когда мне нужно отображать данные в datagird.

Я не хочу, чтобы имена моих столбцов ограничивались именами свойств, например имена без пробелов.

Я хочу иметь возможность привязать список или массив словарей к сетке данных. Я также хочу иметь возможность контролировать, какие данные отображаются в каких столбцах.


person QueueHammer    schedule 13.03.2009    source источник


Ответы (2)


Предположим, у вас есть класс или другой контейнер, к которому вы хотите привязать информацию, вы можете сделать следующее.

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

Теперь просто установите источник элементов таблицы данных на коллекцию элементов, которые у вас есть.

Это позволяет вам установить заголовок, который вы хотите отображать, а также привязывает информацию к переменным в контейнере, таким образом, он отображает информацию только о добавленных вами столбцах.

person Johannes    schedule 20.08.2009
comment
это указывает только привязку столбца, но НЕ источник. - person Raptor; 15.02.2011
comment
Это правильно. Как упоминалось в начале, предполагается, что вы уже связали некоторый настраиваемый объект с сеткой (называемый rpdata). Привязка каждого столбца будет ссылаться на имя свойства в этом настраиваемом объекте. - person Johannes; 16.02.2011

Вы, вероятно, почти достигли цели, но в вашем xaml что-то не так, вот рабочий пример:

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

    }
}
person mattmanser    schedule 19.03.2009