我有一个按ComboBox中所选选项(时间,名称或组ID)排序的消息列表。 我添加了一个带有项目的ComboBox到我的xaml:
<ComboBox x:Name="sort_dropdown" HorizontalAlignment="Left" Margin="828,219,0,0" VerticalAlignment="Top" Width="120" SelectedIndex="0">
<ComboBoxItem x:Name="time_sort" Content="Time" Selected="time_sort_Selected"/>
<ComboBoxItem x:Name="nickname_sort" Content="Nickname" Selected="nickname_sort_Selected"/>
<ComboBoxItem x:Name="groupId_sort" Content="Group ID" Selected="groupId_sort_Selected"/>
</ComboBox>
要重新排序列表,我在cs文件中写了一个函数:
private void reorder()
{
if (time_sort.IsSelected)
fill_chat(MessageSorting.DateSort(Globals.MSG_LOCAL_LIST, ascendingOrder));
else if (nickname_sort.IsSelected)
fill_chat(MessageSorting.UserNameSort(Globals.MSG_LOCAL_LIST, ascendingOrder));
else fill_chat(MessageSorting.GroupIdSort(Globals.MSG_LOCAL_LIST, ascendingOrder));
}
运行时,我得到一个NullReferenceException。经过调试,我发现对象名称引用了null。
示例:time_sort = null。 sort_dropdown = null。等等。
更改xaml上的属性并不会有帮助,因为没有引用来读取这些属性。 感谢。
更新:这不是主窗口,我注意到当我运行代码时,这个窗口类在我调用.show函数之前运行。由于某种原因,其中的代码在没有被调用的情况下执行。
更新2:我有以下代码:
public MainLoggedWindow()
{
MessageBox.Show("Before initialization");
InitializeComponent();
MessageBox.Show("after initialization");
}
运行时,第一个MessageBox显示但第二个不显示。 reorder()函数从以下函数调用:
private void order_dropdown_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ascendingOrder = !ascendingOrder;
reorder();
}
ascendingOrder是一个保存当前排序顺序的bool。还有另外一个包含2项(升序或降序)的组合框,每次用户更改它时,此功能都会运行。
更新3:调试堆栈后,调试显示initializeComponent();
调用order_dropdown_SelectionChanged(...)
调用reorder()
。
解决。
缩小问题范围:initializeComponent();
导致order_dropdown_SelectionChanged(...)
运行。
说明:在xaml中的ComboBox声明中,selectedIndex
属性的定义如下:SelectedIndex="0"
。因此初始化的一部分是创建ComboBox并设置selectedindex=0
,它会立即触发order_dropdown_SelectionChanged(...)
函数。现在,由于ComboBox项目尚未创建,因此名称引用为null,程序崩溃。
解决方案:不要在xaml中定义selectedIndex
属性和_SelectionChanged(...)
。我个人删除了selectedIndex
属性,并在调用initializeComponent();
后以编程方式对其进行了定义。
答案 0 :(得分:-1)
作为InitializeComponent
的一部分,它正在设置order_dropdown
的选择;但这是在设置命名控件之前发生的。因此,您的reorder
方法需要通过将其当前内容包装在if(time_sort!=null)
的测试中来防止这种情况,以确定初始化是否已完成。