我正在尝试将DataTable显示到具有两列的DataGrid上。
当我更新DataTable时,DataGrid会显示新的数据列,但储存格是空的。我已经针对这个问题寻找过许多不同的可能解决方案,但仍然无法显示结果。
下面是我为DataGrid编写的xaml代码:
<DataGrid x:Name="SubjectsList" Height="500" ScrollViewer.CanContentScroll="True" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Subject" Width="2*"/>
<DataGridTextColumn Header="Weekly" Width="*"/>
</DataGrid.Columns>
</DataGrid>
下面是我用于更新表的C#代码:
public void AddSubject(object sender, RoutedEventArgs e)
{
Subject temp = new Subject(SubjectName.Text, Convert.ToInt32(PerWeek.Text));
subjects.Add(temp);
MessageBox.Show(temp.Name + " has been added");
for(int i = 0; i < subjectsTable.Rows.Count; i++)
{
subjectsTable.Rows.RemoveAt(i);
}
foreach (Subject subject in subjects)
{
DataRow dataRow = subjectsTable.NewRow();
dataRow[0] = subject.Name;
dataRow[1] = subject.ClassesPerWeek;
subjectsTable.Rows.Add(dataRow);
MessageBox.Show(subject.Name);
}
SubjectsList.ItemsSource = subjectsTable.DefaultView;
}
在上面的代码中,SubjectsList
是我的数据网格,subjectsTable
是我的数据表。
我已尝试以下方法:
1.使用DataGrid.DataContext
代替DataGrid.ItemSource
1.在我的xAML代码中添加了ItemSource = "{Binding Path=subjectsTable}"
1.尝试使用DataGrid.Items.Add(dataRow)
将行作为项添加
1.为我的用户定义类Subject
的每个数据成员添加了getter
和setter
方法
1.我的所有变量、数据成员和数据结构都是公共的。
如果有人知道如何使数据可见,那么请帮助我。谢谢。
下面是添加两个主题后的情况:
3条答案
按热度按时间x0fgdtte1#
您需要为DataGrid中的每一列指定绑定。
绑定路径将是DataTable中列的名称。
假设您的DataTable列是这样定义的(您还没有演示这一点,所以我只能给予一个示例):
XAML中的DataGrid列定义应如下所示:
另一种方法是将DataGrid的
AutoGenerateColumns
属性设置为true,并省略XAML中的列定义。但这样就无法对网格进行同样多的控制。bakd9h0s2#
如果您想考虑使用MVVM模式(https://intellitect.com/getting-started-model-view-viewmodel-mvvm-pattern-using-windows-presentation-framework-wpf/),下面是一个基本实现:
创建视图模型:
您需要了解以下内容:
1.可观察集合:https://www.c-sharpcorner.com/UploadFile/e06010/observablecollection-in-wpf/
1.信息属性已更改:https://www.c-sharpcorner.com/article/use-inotifypropertychanged-interface-in-wpf-mvvm/
创建实现ICommand的命令:
程式码后置(不是很干净吗?):
XAML:
请参阅以下内容:
1.数据上下文是视图模型
1.网格项源是我的ObservableCollection
输出示例
ozxc1zmp3#
**1.**必须使用类中的相应名称指定
Binding
名称。**2.**声明类如下:
警告:如果没有getter和setter,它将无法工作。
**3.**并添加如下行