C# WPF:填充 DataGrid 失败

本文关键字:DataGrid 失败 填充 WPF | 更新日期: 2023-09-27 18:34:22

我有一个类"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>

在窗口加载事件中,我在 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 所有详细信息,但看不到添加到第 0 个 seive 的插入符号和重量。

C# WPF:填充 DataGrid 失败

我在你的 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;
        }

.class

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

你提到你正在使用列表,但要使数据绑定正常工作,你需要使用 ObservableCollection<T> 它将在集合更改时通知数据网格。

编辑:

正如评论中指出的那样,这与变化无关。您已经将数据上下文设置为列表,因此 DataContext 中不会有seiveData。相反,请尝试以下操作:

ItemsSource="{Binding}"

如果仍需要将更改通知视图,请考虑ObservableCollection<T>如前所述。

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

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

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

另一种方法是从数据表绑定。

使用 将列表转换为数据表

如何:实现泛型类型 T 不是 DataRow 的 CopyToDataTable

从查询创建数据表(LINQ to DataSet)

我今天找到了这个。非常有效。