Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Silverlight中手动向DataGrid添加数据_C#_Silverlight_Datagrid_Dictionary_Itemssource - Fatal编程技术网

C# 如何在Silverlight中手动向DataGrid添加数据

C# 如何在Silverlight中手动向DataGrid添加数据,c#,silverlight,datagrid,dictionary,itemssource,C#,Silverlight,Datagrid,Dictionary,Itemssource,我发现可以在Silverlight中动态创建和绑定datagrid列。但是,我找不到将数据绑定到这些列的方法 如果我尝试使用AutoGenerateColumns=true绑定任何类型的对象,那么对象的每个属性的名称都会添加为列,并且除了不显示数据的现有列之外,对象信息还会显示在网格中 如果应用AutoGenerateColumns=false的列表,则仍会在表中显示行,但列中没有数据 我不想为需要在datagird中显示数据的每种情况创建特定对象 我不希望我的列名仅限于属性的名称,例如不带空格

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

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

如果应用AutoGenerateColumns=false的列表,则仍会在表中显示行,但列中没有数据

我不想为需要在datagird中显示数据的每种情况创建特定对象

我不希望我的列名仅限于属性的名称,例如不带空格的名称


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

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

    }
}

使用System.Windows;
使用System.Windows.Controls;
使用System.Collections.Generic;
命名空间测试项目
{
公共部分类EditableDataGrid:UserControl
{
公共EditableDataGrid()
{
初始化组件();
myDataGrid.ItemsSource=新列表()
{
新建ClassForDataGridTest(){StringValue=“hello”,IntValue=21,IsChecked=false}
,新ClassForDataGridTest(){StringValue=“the second”,IntValue=122,IsChecked=true}
};
}
}
公共类ClassForDataGridTest:DependencyObject
{
公共字符串StringValue{get;set;}
公共int值{get;set;}
已检查公共布尔值{get;set;}
}
}

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

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);
现在只需将datagrid的itemsource设置为您拥有的项集合


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

这只指定列绑定,而不指定源。这是正确的。正如前面提到的,假设您已经将一些自定义对象绑定到网格(称为rpdata)。每个列的绑定都将引用该自定义对象中的属性名称。