Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不调用SelectedItemChanged的情况下选择TreeView项?_C#_Wpf - Fatal编程技术网

C# 在不调用SelectedItemChanged的情况下选择TreeView项?

C# 在不调用SelectedItemChanged的情况下选择TreeView项?,c#,wpf,C#,Wpf,在我的应用程序中,我有一组3d对象,它们通过树状视图向用户公开。当用户在树视图中选择一个项目时,将触发SelectedItemChanged事件,相应的3d对象将设置为选中,并在3d渲染窗口中高亮显示。这个很好用 我遇到的问题是相反的。在代码的一部分中,我以编程方式设置场景中选定的3d对象。我想在树状视图中反映当前选定的对象,因此我会遍历这些项目,直到找到相应的项目。但是,一旦我找到了它,我就无法找到一种方法,在没有调用SelectedItemChanged的情况下使项目显示为选中,这不是我想要

在我的应用程序中,我有一组3d对象,它们通过树状视图向用户公开。当用户在树视图中选择一个项目时,将触发SelectedItemChanged事件,相应的3d对象将设置为选中,并在3d渲染窗口中高亮显示。这个很好用

我遇到的问题是相反的。在代码的一部分中,我以编程方式设置场景中选定的3d对象。我想在树状视图中反映当前选定的对象,因此我会遍历这些项目,直到找到相应的项目。但是,一旦我找到了它,我就无法找到一种方法,在没有调用SelectedItemChanged的情况下使项目显示为选中,这不是我想要的

有办法做到这一点吗


谢谢

我想您想取消事件处理程序中的代码?如果是这样,一种常见的方法是使用布尔标志(有时是int计数器):


是否应该暂时删除TreeView的SelectedItemChanged事件处理程序,并在执行必要的操作后重新添加它?我自己也没试过,但这是我唯一能想到的事情(Marc Gravell抢先给了我最初的答案——我以前也这么做过;)


祝你好运

嗨,马克!这是我的第一个想法,但由于我可能有许多控件的行为应该类似,它可能无法很好地扩展。我本希望避免这样的解决方案,但我可能不得不笑着忍受。这正是我要做的。我可能错了,但我看不出任何规模问题。您只需要一个标志——或者在级联的情况下,对于您想要无响应的每个控件,可能需要一个标志——您必须记住在编写“代码选择控件”调用时设置该标志。
bool updatingSelected;

void SomeHandler(object sender, EventArgs args) { // or whatever
  if(updatingSelected) return;

  //...
}

void SomeCode() {
    bool oldFlag = updatingSelected;
    updatingSelected = true;
    try {
       // update the selected item
    } finally {
       updatingSelected = oldFlag;
    }
}