ComboBox和ComboBoxItem名称为null

时间:2018-04-17 20:46:57

标签: c# wpf combobox

我有一个按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();后以编程方式对其进行了定义。

1 个答案:

答案 0 :(得分:-1)

作为InitializeComponent的一部分,它正在设置order_dropdown的选择;但这是在设置命名控件之前发生的。因此,您的reorder方法需要通过将其当前内容包装在if(time_sort!=null)的测试中来防止这种情况,以确定初始化是否已完成。