WPF鼠标双击事件是如何工作的?

How WPF mouse double click event works?

我在代码后面的 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。此外,我无法在调试会话期间显示值。 当我将方法更改为:

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);
    }
}

似乎一切正常。异步鼠标双击是如何工作的,我不能像第一个表示那样调用事件?

第一个和第二个代码片段之间的主要区别在于第一个代码片段不检查是否确实存在 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.

无关

编辑:

如果 MyCustomTypestruct 你不能使用 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);
    }
}