简体   繁体   English

Treeview.Items.Clear() 方法在 SelectedItemChanged 事件中返回 null 异常(e.NewValue==null)

[英]Treeview.Items.Clear() method return null exception (e.NewValue==null) in SelectedItemChanged Event

I am from Iran and I cant speak English very well, sorry.我来自伊朗,我的英语说得不好,抱歉。 I made something like OpenFileDialog in WinForms and work correctly.我在 WinForms 中制作了类似OpenFileDialog东西并且工作正常。 After, for better user interface, I tried to make it in WPF.之后,为了更好的用户界面,我尝试在 WPF 中制作它。 I use TreeView and other controls for it in both platforms (Winforms and WPF) in Winforms I could do this correctly usingbelow code:我在 Winforms 的两个平台(Winforms 和 WPF)中都使用了TreeView和其他控件,我可以使用以下代码正确执行此操作:

private void Folder_FileTreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
    Folder_FileTreeView.Nodes.Clear();//this is necessary to clean first page node, after  get new folders
    if(e.Node.Text=="Desktop")//also this code is necessary to compare node 
    {
        //Do something
    }
}

在此处输入图片说明 Also in WPF I can get text of Item by below code:同样在 WPF 中,我可以通过以下代码获取 Item 的文本:

private void Folder_FileTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    if (e.NewValue!=null)
    {
        StackPanel CustomStackPanel = (StackPanel)((TreeViewItem)e.NewValue).Header;
        TextBlock textBlock = (TextBlock)CustomStackPanel.Children[1];
        nodetext = textBlock.Text;//this line return text of item for compare
    }
    Folder_FileTreeView.Items.Clear();
}

在此处输入图片说明 If I don't use Folder_FileTreeView.Items.Clear() the above code return folders without clearing first page, but if I do use Folder_FileTreeView.Items.Clear() e.NewValue returns null .如果我不使用Folder_FileTreeView.Items.Clear()上面的代码返回文件夹而不清除第一页,但如果我使用Folder_FileTreeView.Items.Clear() e.NewValue返回null Please help me to use together these codes: Folder_FileTreeView.Items.Clear();(or clear first page) and get text of selecteditem by user without return null请帮我一起使用这些代码: Folder_FileTreeView.Items.Clear();(或清除第一页)并由用户获取所选项目的文本而不返回空

Thanks A lot多谢

e.NewItem will be null if the TreeView used to have an item selected but now does not. e.NewItem如果TreeView曾经选择了一个项目,但现在没有选择, e.NewItem null When you clear the items, you are removing any selection, this of course changes the selection and raises the SelectedItemChanged event with null as the new selection- since there are no possible items that could be selected.当你清除的项目,要删除的任何选择,这当然改变了选择和引发SelectedItemChanged与事件null作为新的选择-因为有可能被选中任何可能的项目。

If you want to replace the items in the list with new items after the user makes a selection, the selected item will be null while that change is happening.如果您想在用户进行选择后用新项目替换列表中的项目,则在发生更改时所选项目将为null You need to do the following:您需要执行以下操作:

  1. Handle the SelectedItemChanged event and remember the new selected item in a variable .处理SelectedItemChanged事件并记住变量中的新选定项 For example, if they click on the item for "Desktop" set a variable (eg Path ) to the path for the user's desktop (eg C:\\Users\\UserName\\Desktop).例如,如果他们单击“桌面”项,则将变量(例如Path )设置为用户桌面的路径(例如 C:\\Users\\UserName\\Desktop)。
  2. Clear the list of folders in the TreeView .清除TreeView中的文件夹列表。 This will trigger SelectedItemChanged again, but you want to ignore it this time because e.NewItem == null .这将再次触发SelectedItemChanged ,但这次您想忽略它,因为e.NewItem == null
  3. Read all the folders in Path and make new items for each of those folders.读取Path所有文件夹并为每个文件夹创建新项目。

The way was found by below code方法是通过下面的代码找到的

private void Folder_FileTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    Folder_FileTreeView.SelectedItemChanged -= Folder_FileTreeView_SelectedItemChanged;
    if (e.NewValue!=null)
    {
        StackPanel CustomStackPanel = (StackPanel)((TreeViewItem)e.NewValue).Header;
        TextBlock textBlock = (TextBlock)CustomStackPanel.Children[1];
        nodetext = textBlock.Text;//this line return text of item for compare
    }
    Folder_FileTreeView.Items.Clear();
    Folder_FileTreeView.SelectedItemChanged += Folder_FileTreeView_SelectedItemChanged;
}

thank very much for every one helped me非常感谢每一位帮助我的人

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM