我在代码后面的wpf数据网格上有鼠标双击事件,如下所示:
async void dataGrid_MouseDoubleClick(object o, MouseButtonEventArgs e)
{
var dg = (DataGrid)o;
var item = (MyCustomType)dg.SelectedItem;
await MyAsyncMethod(item.Id);
}
并在线
var dg = (DataGrid)o;
发生NullReferenceException。 Morover,我无法在调试会话期间显示价值。 当我将我的方法改为:
async void dataGrid_MouseDoubleClick(object o, MouseButtonEventArgs e)
{
if(o is DataGrid && (o as DataGrid).SelectedItem !=null)
{
await MyAsyncMethod(((MyCustomType)(o as DataGrid).SelectedItem).Id);
}
}
每一件事似乎都能正常运作。异步鼠标双击如何工作,我不能像第一次表示一样调用事件?
答案 0 :(得分:2)
第一个和第二个代码段之间的主要区别在于第一个代码片段不会检查是否确实存在SelectedItem
。
像这样使用as
运算符,您应该没问题:
async void dataGrid_MouseDoubleClick(object o, MouseButtonEventArgs e)
{
var dg = (DataGrid)o;
var item = dg.SelectedItem as MyCustomType;
if (item != null)
await MyAsyncMethod(item.Id);
}
您的问题与事件本身无关,也与async
/ await
无关。
修改强>
如果MyCustomType
是struct
,您无法使用as
运算符,但仍应检查SelectedItem
属性是否实际设置:
async void dataGrid_MouseDoubleClick(object o, MouseButtonEventArgs e)
{
var dg = (DataGrid)o;
if (dg.SelectedItem != null)
{
await MyAsyncMethod(((MyCustomType)dg.SelectedItem)item.Id);
}
}