使用动态类型时无法对空引用执行运行时绑定
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.SelectedItem
或CallTabLv1.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 单击
选择多个项目而使您的代码崩溃
我有一个列表视图,这个列表视图会在收到消息时更新。
下面的代码是关于如何获取所选行的值的。
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.SelectedItem
或CallTabLv1.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 单击
选择多个项目而使您的代码崩溃