Как вручную добавить данные в DataGrid в Silverlight
-
22-07-2019 - |
Вопрос
Я обнаружил, что столбцы сетки данных можно динамически создавать и связывать в Silverlight. Однако я не могу найти способ привязать данные к этим столбцам.
Если я пытаюсь связать любой тип объекта с AutoGenerateColumns = true, то имена каждого свойства объекта добавляются в виде столбцов, а информация об объекте отображается в сетке в дополнение к существующим столбцам, которые не содержат данных. р>
Если я применю список с AutoGenerateColumns = false, тогда я все равно получу строки, которые будут отображаться в таблице, но нет данных в столбцах.
Я не хочу создавать конкретный объект для каждого случая, когда мне нужно отображать данные в птице данных.
Я не хочу, чтобы имена моих столбцов ограничивались именами свойств, например, имена без пробелов.
Я хочу иметь возможность связать список или словарный массив с сеткой данных. Я также хочу иметь возможность контролировать, какие данные отображаются в каких столбцах.
Решение
Предположим, у вас есть класс или другой контейнер, с которым вы хотите связать информацию, вы можете сделать следующее.
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);
Теперь просто установите в качестве источника элементов таблицы данных набор элементов, который у вас есть.
Это позволяет вам установить заголовок, который вы хотите отобразить, а также привязывает информацию к переменным в контейнере, таким образом, он отображает информацию только о столбцах, которые вы добавляете.
Другие советы
Вероятно, вы почти у цели, но в вашем 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; }
}
}