【问题标题】:Selecting a TreeView Item without invoking SelectedItemChanged?在不调用 SelectedItemChanged 的​​情况下选择 TreeView 项?
【发布时间】:2009-05-21 19:58:04
【问题描述】:

在我的应用程序中,我有一组 3d 对象,它们通过 TreeView 暴露给用户。当用户在 TreeView 中选择一个项目时,会触发 SelectedItemChanged 事件,相应的 3d 对象被设置为选中并在 3d 渲染窗口中突出显示。这很好用。

我遇到的问题是相反的。在我的一段代码中,我以编程方式在场景中设置选定的 3d 对象。我想在 TreeView 中反映当前选择的对象,所以我遍历这些项目,直到找到对应的项目。但是一旦我开始使用它,我就无法找到一种方法让该项目在没有调用 SelectedItemChanged 的​​情况下显示为选中状态,这不是我想要的。

有没有办法做到这一点?

谢谢!

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

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

    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;
        }
    }
    

    【讨论】:

    • 嗨,马克!这是我的第一个想法,但由于我可能有许多应该表现相似的控件,因此它可能无法很好地扩展。我希望避免这样的解决方案,但我可能不得不笑着忍受。
    • 这就是我的做法。我可能是错的,但我没有看到任何规模问题。您只需要一个标志 - 或者可能为您希望在级联的情况下不响应的每个控件设置一个标志 - 您必须记住在每次编写“代码选择控件”调用时设置。
    【解决方案2】:

    暂时删除 TreeView 的 SelectedItemChanged 事件处理程序,并在执行了必要的操作后重新添加它是否合适?我自己没有尝试过,但这是我唯一能想到的其他事情(Marc Gravell 击败了我,我原来的答案是 - 我以前做过 ;))。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多