使用动态类型时无法对空引用执行运行时绑定

Cannot perform runtime binding on a null reference when using type dynamic

我有一个列表视图,这个列表视图会在收到消息时更新。

下面的代码是关于如何获取所选行的值的。

private void CallTabLv_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{
  string callDetailValue = "";

  dynamic selectedCallDetail;

  //When a row of call detail is selected, return the selected row's value only
  if (LineBtn1.IsChecked == true)
  {
    selectedCallDetail = CallTabLv1.SelectedItem;
    callDetailValue = selectedCallDetail.Value;
  }

  if (LineBtn2.IsChecked == true)
  {
    selectedCallDetail = CallTabLv2.SelectedItem;
    callDetailValue = selectedCallDetail.Value;
  }

  if (string.IsNullOrEmpty(callDetailValue))
    callDetailValue = string.Empty;

  Clipboard.Clear();
  Clipboard.SetText(callDetailValue);
}

第一条消息运行良好,我可以获得所选行的值。问题是当第二条消息进来时,我的应用程序停止了并且 returned "Cannot perform runtime binding on a null reference".

顺便问一下,对于return单选行的值,应该使用哪一个:CallTabLv1.SelectedItemCallTabLv1.SelectedItems[0]?正如我所尝试的,如果使用后者,当第二条消息进入时它将 return "ArgumentOutOfRange Exception"。

请帮忙。

更新: 当消息进来时,我通过清除整个列表视图来更新列表视图,然后逐行打印它。我不确定它是否是由我更新列表视图的方式引起的。

这可能是因为您正在清除您现在更改了所选项目的集合。由于此时项目可以为空,因此动态对象将无法访问 属性 "Value"

您正在检查是否选中了一个复选框,这不一定是所选项目是否存在的条件。我建议您更新代码。

private void CallTabLv_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{
    string callDetailValue = "";
    dynamic selectedCallDetail;
    //When a row of call detail is selected, return the selected row's value only
    if (LineBtn1.IsChecked == true)
    {
        selectedCallDetail = CallTabLv1.SelectedItem;
    }
    if (LineBtn2.IsChecked == true)
    {
        selectedCallDetail = CallTabLv2.SelectedItem;
    }
    // I think the 'invalid' casting is happening with the "selectedCallDetail.Value" as when you clear a listbox it is no longer selected. 
    callDetailValue = (selectedCallDetail != null) ?  selectedCallDetail.Value : string.Empty;
    Clipboard.Clear();
    Clipboard.SetText(callDetailValue);
 }

您应该使用 SelectedItem,因为 SelectedItems 集合可能为 null 或为空,如果您只想要一个结果,这通常是最好的。还要确保您的 ListBox 只允许选择一个项目,这样用户就不会通过使用 SHIFT 或 CTRL 单击

选择多个项目而使您的代码崩溃