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 的插入符号和重量。
我在你的 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)
我今天找到了这个。非常有效。