如何在异步任务列表中创建DataGrid ItemSource

时间:2019-07-16 07:44:58

标签: c# wpf

我需要获取一个列表,作为wpf中DataGrid的ItemSource。我可以从异步方法中获得结果,如下所示:

public async Task<List<ManualReadTag>> GetManuallyReadTags(ParameterManualTags model { ..... }

,然后尝试将其值显示在MainWindow.xaml的DataGrid中,如下所示:

public partial class MainWindow : Window
{
    readonly ApplicationController _ac = new ApplicationController();
    private Task<List<ManualReadTag>> _manualReadTagList = null;
    public MainWindow()
    {
        InitializeComponent();
    }

    private void BtnGEtManualCount_OnClick(object sender, RoutedEventArgs e)
    {
        GetManuallyReadTags();
    }

    private void GetManuallyReadTags()
    {
        var model = new ParameterManualTags
        {
            Lane = Convert.ToInt32(TxtLane.Text),
            Plaza = Convert.ToInt32(TxtLane),
            DateTo = DateTo.DisplayDate,
            DateFrom = DateFrom.DisplayDate
        };
         _manualReadTagList = _ac.GetManuallyReadTags(model);
        ViewingGrid.ItemsSource = _manualReadTagList;
    }
}

但是在ViewingGrid.ItemsSource = _manualReadTagList;上它给我一个错误:

  

严重性代码描述项目文件行抑制状态   错误CS0266无法隐式转换类型   'System.Threading.Tasks.Task>'   到“ System.Collections.IEnumerable”。存在显式转换   (您是否想念一个   演员?)TagReporting D:\ Projects \ Lane \ Antenna_Reading \ TagReporting \ TagReporting \ MainWindow.xaml.cs 38有效

如何将异步Task方法的结果用作数据网格的ItemSource?谢谢。

1 个答案:

答案 0 :(得分:1)

首先,如果GetManuallyReadTags是一个 async 方法,但其命名方法不是很好,它应该具有一个异步后缀GetManuallyReadTagsAsync以使其明显。

第二,它是await async 调用的理想选择。

private async Task GetManuallyReadTagsAsync()
{
    var model = new ParameterManualTags
    {
        Lane = Convert.ToInt32(TxtLane.Text),
        Plaza = Convert.ToInt32(TxtLane),
        DateTo = DateTo.DisplayDate,
        DateFrom = DateFrom.DisplayDate
    };

     _manualReadTagList = await _ac.GetManuallyReadTags(model);
    ViewingGrid.ItemsSource = _manualReadTagList;
}

您还可以将_manualReadTagList的类型更改为

private List<ManualReadTag> _manualReadTagList;

最后在异步事件处理程序中调用GetManuallyReadTagsAsync()

private async void BtnGEtManualCount_OnClick(object sender, RoutedEventArgs e)
{
    await GetManuallyReadTagsAsync();
}