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