2016-11-10 1 views
0

私が遭遇した問題があり、それを防ぐことが可能かどうかはわかりません。私はそれがデフォルトでこれのように設計されています。WPF IsSelectedは、子を選択するときにトリガーを防止します。

Iは、選択された場合、いくつかのテキストボックスを充填され、XML及びこれらノードの各々によって充填されるツリービューリストを符号化しています。そのタイプに応じて、異なる機能がトリガーされます。

問題は、子供を選択すると、すべての親のツリービューアイテム「トップセラー」がトリガーされて、関連する機能がトリガーされてしまい、その必要がないということです。

IsSelectedのために、この「逆継承のソート」を防ぐために、どのように任意のアイデア?

例:「ノード」を選択すると、「Node_Selected」、「Dialog_Selected」、「Actor_Selected」がトリガーされます。

ありがとうございました。

敬具、ジャストコンテキストの

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     XmlDocument document = new XmlDocument(); 
     document.Load("XML/ActorsDialogs.xml"); 

     XmlNodeList actors = document.SelectNodes("/dialogs/actor"); 

     foreach (XmlNode actor in actors) 
     { 
      TreeViewItem newActor = new TreeViewItem(); 
      newActor.Header = actor.SelectSingleNode("actorname").InnerText; 
      newActor.Selected += new RoutedEventHandler(Actor_Selected); 

      XmlNodeList dialogs = actor.SelectNodes("dialog"); 
      foreach (XmlNode dialog in dialogs) 
      { 
       TreeViewItem newdialog = new TreeViewItem(); 
       newdialog.Header = "Dialog:" + dialog.SelectSingleNode("dialogID").InnerText; 
       newdialog.Selected += new RoutedEventHandler(Dialog_Selected); 

       BuildNodes(newdialog, dialog); 

       newActor.Items.Add(newdialog); 
      } 
      ActorsList.Items.Add(newActor); 
     } 
    } 

    private void BuildNodes(TreeViewItem treeNode, XmlNode parentElement) 
    { 
     foreach (XmlNode child in parentElement.ChildNodes) 
     { 
      if (child.Name == "node" || child.Name == "reply") 
      { 
       XmlElement childElement = child as XmlElement; 
       TreeViewItem childTreeNode = new TreeViewItem(); 
       string ID = child.SelectSingleNode(child.Name + "ID").InnerText; 
       childTreeNode.Header = childElement.Name + ":" + ID; 
       switch (child.Name) 
       { 
        case "node": 
         childTreeNode.Selected += new RoutedEventHandler(Node_Selected); 
         break; 
        case "reply": 
         childTreeNode.Selected += new RoutedEventHandler(Reply_Selected); 
         break; 
        default: 
         break; 
       } 


       treeNode.Items.Add(childTreeNode); 
       BuildNodes(childTreeNode, childElement); 
      } 
     } 
    } 

    private void Actor_Selected(object sender, RoutedEventArgs e){} 
    private void Dialog_Selected(object sender, RoutedEventArgs e){} 
    private void Node_Selected(object sender, RoutedEventArgs e){} 
    private void Reply_Selected(object sender, RoutedEventArgs e){} 
+1

は、あなたが発生し、選択されたノードをしたいですが、ダイアログや俳優選択されていませんか?あれは正しいですか?私の例では – phil

+0

、はい。 Dialog_SelectedがDialogに選択された場合、Dialog_Selectedだけが発生します。そう正確に正しい答えです –

答えて

2

イベントハンドラでは、あなたはe.Handled = trueを設定することができます。それは、イベントが木の上にバブリングするのを防ぎます。

private void Node_Selected(object sender, RoutedEventArgs e) 
{ 
    e.Handled = true; //this will prevent the event from bubbling up to parents; 
    //Do the rest of the code here. 
} 

RoutedEventsの詳細については、https://msdn.microsoft.com/en-us/library/ms742806%28v=vs.110%29.aspxを参照してください。これらは、木を下るツリーとトンネリングイベントを上がるバブリングイベントが含まれます。

+0

。完璧に働き、何かを学んだ。参照をチェックアウトします。ありがとうございました。 –

関連する問題