【问题标题】:How to manually add data to a DataGrid in Silverlight如何在 Silverlight 中手动将数据添加到 DataGrid
【发布时间】:2010-10-13 04:52:29
【问题描述】:

我发现数据网格列可以在 Silverlight 中动态创建和绑定。但是我找不到将数据绑定到这些列的方法。

如果我尝试使用 AutoGenerateColumns = true 绑定任何类型的对象,则对象的每个属性的名称都会添加为列,并且除了不显示数据的现有列之外,对象信息还会显示在网格中。

如果我应用 AutoGenerateColumns = false 的列表,那么我仍然会在表格中显示行但在列中没有数据。

我不想为每个需要在数据网格中显示数据的情况创建一个特定对象。

我不希望我的列名仅限于属性名称,例如没有空格的名字。

我希望能够将列表或字典数组绑定到数据网格。我还希望能够控制哪些数据显示在哪些列中。

【问题讨论】:

    标签: c# silverlight datagrid dictionary itemssource


    【解决方案1】:

    假设您有一个类或其他一些您想要将信息绑定到的容器,您可以执行以下操作。

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

    现在只需将数据网格的 itemsource 设置为您拥有的项目集合。

    这允许您设置要显示的标题,并且它还将信息绑定到容器中的变量,因此它只显示您添加的列的信息。

    【讨论】:

    • 这仅指定列绑定,但不指定源。
    • 没错。如开头所述,假设您已经将一些自定义对象绑定到网格(称为 rpdata)。每列的绑定将引用该自定义对象中的属性名称。
    【解决方案2】:

    您可能快到了,但只是在您的 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; }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      相关资源
      最近更新 更多