C#WPF:填充DataGrid失败

时间:2012-05-17 10:28:26

标签: c# wpf datagrid populate

我有一个“Seive”类,一个ObservableCollection seiveData对象。

        public Seive(String id)
    {
        SeiveIdSize = id;
        Caret = 0.0;
        Percent = 0.0;
        Peices = 0;
        Weight = 0.0;
        Size = 0;
    }

    public String SeiveIdSize   {    get;   set;   }
    public Double Weight { get; set; }
    public Double Percent   {    get;   set;   }
    public Double Caret {    get;   set;   }
    public uint Size    {    get;   set;   }
    public uint Peices  {    get;   set;   }

在我的xml中:我有

<DataGrid  Name="serverGrid" ItemsSource="{Binding}" .....>
<DataGrid.Columns>
<DataGridTextColumn Header="SEIVE" Width="Auto" Binding="{Binding Path=SeiveIdSize}" SortDirection="Ascending" />
 <DataGridTextColumn Header="CTS" Width="Auto" Binding="{Binding Path=Caret}" />
 <DataGridTextColumn Header=" % " Width="Auto" Binding="{Binding Path=Percent}" />
 <DataGridTextColumn Header="PCS" Width="Auto" Binding="{Binding Path=Peices}" />
 <DataGridTextColumn Header="WGT" Width="Auto" Binding="{Binding Path=Weight}" />
 <DataGridTextColumn Header="SIZE" Width="Auto" Binding="{Binding Path=Size}" />                                    
 </DataGrid.Columns>

在窗口Loaded事件中,我在seiveData中填充了2个seive,但是我没有看到任何结果/行。

seivesData.Add(new Seive("+10"));
seivesData.Add(new Seive("+8"));
seivesDataGrid.DataContext = seivesData;

编辑: 按钮事件代码:

        private void saveBtn_Click(object sender, RoutedEventArgs e)
    {
        Seive s1 = new Seive("+2");
        s1.Peices = 100;
        s1.Caret = 0.41;
        s1.Weight = 0.10;
        seivesData.Add(s1);
        Seive s = seivesData[0];
        s.Caret = 0.54;
        s.Weight = 0.32;
        seivesData[0] = s;
        seiveDG.DataContext = seivesData;
    }

我哪里错了?我可以看到新添加的Seive所有细节,但Not the Caret&amp;重量加到第0位。

4 个答案:

答案 0 :(得分:2)

我在你的xaml中看到的基本问题是你设置了ItemsSource = {binding SeiveData} 如果将此属性传递到网格的数据上下文中,则会出错。

以下代码现在正在运行。核实。

如果你想将chagnes通知给Seive类,那么还有一件事就是必须实现INotifyPropertyChange接口。

XAML

<DataGrid Name="serverGrid" ItemsSource="{Binding}">
        <DataGrid.Columns>
            <DataGridTextColumn Width="Auto"
                                Binding="{Binding Path=SeiveIdSize}"
                                Header="SEIVE"
                                SortDirection="Ascending" />
            <DataGridTextColumn Width="Auto"
                                Binding="{Binding Path=Caret}"
                                Header="CTS" />
            <DataGridTextColumn Width="Auto"
                                Binding="{Binding Path=Percent}"
                                Header=" % " />
            <DataGridTextColumn Width="Auto"
                                Binding="{Binding Path=Peices}"
                                Header="PCS" />
            <DataGridTextColumn Width="Auto"
                                Binding="{Binding Path=Weight}"
                                Header="WGT" />
            <DataGridTextColumn Width="Auto"
                                Binding="{Binding Path=Size}"
                                Header="SIZE" />
        </DataGrid.Columns>
    </DataGrid> 

落后于

 ObservableCollection<Seive> _seiveData;
        public ObservableCollection<Seive> SeiveData
        {
            get { return _seiveData; }
            set { _seiveData = value; }
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            SeiveData = new ObservableCollection<Seive>();
            SeiveData.Add(new Seive("+10"));
            SeiveData.Add(new Seive("+8"));

            serverGrid.DataContext = SeiveData;

        }

上课

 public class Seive
    {
        public Seive(String id)
        {
            SeiveIdSize = id;
            Caret = 0.0;
            Percent = 0.0;
            Peices = 0;
            Weight = 0.0;
            Size = 0;
        }

        public String SeiveIdSize { get; set; }
        public Double Weight { get; set; }
        public Double Percent { get; set; }
        public Double Caret { get; set; }
        public uint Size { get; set; }
        public uint Peices { get; set; }
    }

答案 1 :(得分:1)

您提到您正在使用列表,但是为了使数据绑定工作,您需要使用ObservableCollection<T>,如果集合发生更改,它将通知数据网格。

编辑:

正如评论中所指出的,这不是关于变化的。您已经将datacontext设置为列表,因此DataContext中不会有seiveData。相反,请尝试以下方法:

ItemsSource="{Binding}"

如果您仍需要通知您对更改的看法,请考虑已提及的ObservableCollection<T>

答案 2 :(得分:0)

容器的DataContext(DataGrid所在的)可能不会设置为提供seiveData - 属性的对象。或者您的seiveData - 列表甚至不是由属性支持,而只是一个字段。这是不允许的。即使字段(成员变量)被声明为public,绑定引擎也不会绑定它 - 它必须由属性支持。

另请注意,如果您填写Loaded-event中的列表,seiveList必须是INotifyCollectionChanged - 实施集合,例如ObservableCollection<T>,因为绑定是在人口之前完成的。名单。否则,DataGrid将不知道新数据已插入列表中。

答案 3 :(得分:0)

每个人所说的一种方法是将其绑定到ObservableCollection

另一种方法是从DataTable绑定。

使用

将列表转换为DataTable

How to: Implement CopyToDataTable Where the Generic Type T Is Not a DataRow

Creating a DataTable From a Query (LINQ to DataSet)

我今天发现了这个。非常有效。