【发布时间】:2022-01-30 20:13:40
【问题描述】:
我的问题是我试图在我的 WPF 应用程序中将 Task 绑定到 DataGrid,但我不明白问题是什么以及我做错了什么。
我有 3 个模型
学科组教师:
public class DisciplineGroupTeacher
{
[JsonPropertyName("iddiscipline-group-teacher")]
public int IdDisciplineGroupTeacher { get; set; }
[JsonPropertyName("idteacher")]
public int? IdTeacher { get; set; }
[JsonPropertyName("iddiscipline")]
public int IdDiscipline { get; set; }
[JsonPropertyName("idgroup")]
public int IdGroup { get; set; }
public async Task<Teacher> Teacher() => await DataWorker.GetTeacher(IdTeacher);
public async Task<Group> Group() => await DataWorker.GetGroup(IdGroup);
public async Task<Discipline> Discipline() => await DataWorker.GetDiscipline(IdDiscipline);
}
老师:
public class Teacher
{
[JsonPropertyName("idteacher")]
public int IdTeacher { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; }
}
组:
public class Group
{
[JsonPropertyName("idgroup")]
public int IdGroup { get; set; }
[JsonPropertyName("group_name")]
public string Name { get; set; }
[JsonPropertyName("iddepartment")]
public int IdDepartment { get; set; }
}
纪律:
public class Discipline
{
[JsonPropertyName("iddiscipline")]
public int IdDiscipline { get; set; }
[JsonPropertyName("discipline_name")]
public string Name { get; set; }
}
在 Data Worker 中,我有从 API 获取的方法:
public class DataWorker
{
public static async Task<Teacher> GetTeacher(int? id)
{
var client = new HttpClient();
var streamTask = client.GetStreamAsync($"myurl...");
var data = await JsonSerializer.DeserializeAsync<Teacher>(await streamTask);
return data;
}
public static async Task<Discipline> GetDiscipline(int id)
{
var client = new HttpClient();
var streamTask = client.GetStreamAsync($"myurl...");
var data = await JsonSerializer.DeserializeAsync<Discipline>(await streamTask);
return data;
}
public static async Task<Group> GetGroup(int id)
{
var client = new HttpClient();
var streamTask = client.GetStreamAsync($"myurl...");
var data = await JsonSerializer.DeserializeAsync<Group>(await streamTask);
return data;
}
}
在某个事件中,我得到一个 BindingList,在其中我得到一个 List 并绑定到 DataGrid
BindingList<DisciplineGroupTeacher> dgts= new BindingList<DisciplineGroupTeacher>(await DataWorker.GetDisciplineGroupTeachers());
MyDataGrid.ItemsSource = dgts;
在 XAML 中我做绑定
<DataGrid x:Name="MyDatGrid" AutoGenerateColumns="False" CanUserAddRows="False" ColumnWidth="*" IsReadOnly="True" FontSize="13">
<DataGrid.Columns>
<materialDesign:DataGridTextColumn Header="Discipline" Binding="{Binding Discipline.Name}"/>
<materialDesign:DataGridTextColumn Header="Group" Binding="{Binding Group.Name}"/>
<materialDesign:DataGridTextColumn Header="Teacher" Binding="{Binding Teacher.Name}"/>
</DataGrid.Columns>
</DataGrid>
但是当我开始时,我需要的字段不会出现在数据网格中。我究竟做错了什么?我最近遇到了异步等待。在此之前,应用程序使用本地数据库,但现在我需要从 API 获取数据。
【问题讨论】:
-
您可能需要添加 ViewModel,它可以使用像 this 这样的包装类型进行数据绑定。
-
@StephenCleary 我从文档中获取了 NotifyTaskCompletion 类并删除了 INotifyPropertyChanged。我尝试使用此类获取属性的数据:Teacher _Teacher => new TaskCompletion
(DataWorker.GetTeacher(IdTeacher)).Result;但结果仍然没有显示在数据网格中。 -
NotifyTaskCompletion的全部意义在于它实现了INotifyPropertyChanged。所以你的数据绑定会绑定到Teacher.Result,你的代码会绑定Teacher = new NotifyTaskCompletion(DataWorker.GetTeacher(IdTeacher))。Result以null开头,然后 更改 为异步操作完成时的结果;这就是为什么需要INotifyPropertyChanged。 -
视图模型在哪里?什么是 DataContext?
标签: c# wpf async-await