Pergunta

Eu descobri que colunas datagrid podem ser dinamicamente criado e ligado no Silverlight. No entanto não consigo encontrar uma maneira de dados se ligam a essas colunas.

Se eu tentar vincular qualquer tipo de objeto com AutoGenerateColumns = true, então os nomes de cada propriedade do objeto são adicionados como colunas e as informações do objeto é exibido na grade, além das colunas existentes que não apresentem dados.

Se eu aplicar uma lista com AutoGenerateColumns = false, então eu ainda obter linhas a mostrar-se na mesa, mas há dados nas colunas.

Eu não quero criar um objeto específico para cada caso que eu preciso para exibir dados na datagird.

Eu não quero ter meus nomes de coluna limitado aos nomes de propriedades, por exemplo, nomes com os espaços.

Eu quero ser capaz de ligar uma lista ou uma matriz dicionário para a grade de dados. Eu também quero ser capaz de controlar o que mostram os dados em que colunas.

Foi útil?

Solução

Suponha que você tenha uma classe ou algum outro recipiente que deseja informações se ligam a, você pode fazer o seguinte.

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

Agora é só definir o seu ItemSource do datagrid para a coleção de itens que você tem.

Isso permite que você defina o cabeçalho que você deseja exibir, e também se liga a informação para variáveis ??no recipiente, portanto, ele exibe as informações de apenas as colunas que você adicionar.

Outras dicas

Você é provavelmente quase lá, mas apenas ter algo sutilmente errado em seu xaml, aqui está um exemplo de trabalho:

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

    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top