2012-02-01 7 views
2

コードを読むのは非常に難しいと思いますが、私はベストを尽くそうとします!ここでTreeViewの親ノードへのアクセス?

は私のXAMLコードがある:ときに私、今

Screenshot

<TreeView x:Name="stateMachinesView" 
      DockPanel.Dock="Top" 
      SelectedItemChanged="item_Selected" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
      BorderThickness="0"> 
<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding Value}"> 
     <HierarchicalDataTemplate.ItemTemplate> 
      <DataTemplate> 
       <DockPanel> 
        <DockPanel.ContextMenu> 
         <ContextMenu> 
          <MenuItem Header="Create Thumbnail" 
             Click="MenuItemCreate_Click"/> 
         </ContextMenu> 
        </DockPanel.ContextMenu> 
        <Image> 
         <Image.Style> 
          <Style TargetType="Image"> 
           <Style.Setters> 
            <Setter Property="Source" 
              Value="Resources\state.png"/> 
           </Style.Setters> 
           <Style.Triggers> 
            <DataTrigger Binding="{Binding Item2}" 
               Value="true"> 
             <Setter Property="Source" 
               Value="Resources\state_init.png"/> 
            </DataTrigger> 
           </Style.Triggers> 
          </Style> 
         </Image.Style> 
        </Image> 
        <TextBlock> 
         <TextBlock.Text> 
          <Binding Path="Item1"/> 
         </TextBlock.Text> 
        </TextBlock> 
       </DockPanel> 
      </DataTemplate> 
     </HierarchicalDataTemplate.ItemTemplate> 
     <DockPanel> 
      <Image DockPanel.Dock="Left" 
        Source="Resources\state_machine.png"/> 
       <TextBlock Text="{Binding Key}"/> 
     </DockPanel> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 
</TreeView> 

この項目ソースがDictionary<string, ObservableCollection<Tuple<string, bool>>>

視覚的にですが、私はこのような何かを得ました私のMenuItemをクリックしてください:

ここ
private void MenuItemCreate_Click(object sender, RoutedEventArgs e) 
{ 
    string stateName = 
     ((sender as FrameworkElement).DataContext as Tuple<string, bool>).Item1; 
} 

私は上記のコードでState1_1にアクセスすることができますが、今、私はSM1親ノードにアクセスしたいと思います!

DependencyObject parent = VisualTreeHelper.GetParent(sender as DependencyObject); 
while (!(parent is TreeViewItem)) 
    parent = VisualTreeHelper.GetParent(parent); 

しかし、それは、私は、あまりにも、テンプレート考えています

...動作しません:私は多くのことを試してみました

、(解決に)最も近いが、このでしたXAMLで、私は簡単にコードビハインドでそれを行うことができます!

+0

あなたはTreeview ..を介してループする簡単な方法をお探しですか?その場合は、コード内のスターターとして使用できる非常に簡単な例を貼り付けることができます。 – MethodMan

答えて

2

ContextMenusは、それらが使用されているオブジェクトと同じビジュアルツリーにありません。あなたはあなたがContextMenu.PlacementTargetからTreeViewItemを得ることができますが、ContextMenuまで取得する必要が二回

  1. を上がるいます。
  2. 今度はそのツリーを親のTreeViewItemに上げることができます。

もちろん、データ項目自体の親への参照があれば簡単です。 TreeViewItemsにアクセスする必要はありません。通常、すべてを必要に応じてバインドします。

+0

ContextMenu.PlacementTargetはコード内にDockPanelを返します。 TreeViewItemにキャストしようとすると、nullが返されます。何か不足していますか? –

+0

即時ウィンドウ(ctrl + D + ctrl + I)を使用しましたか?これはあなたのオブジェクトにアクセスし、typeof()を使って型を見るのに使うことができます。また、クラスのメンバーとしてツリービューへの参照がある場合は、SelectedItemプロパティを使用してノードを取得できます。当初、私はツリービューでコード化している問題がありました。そして、それをXAMLデータバインディングで処理することに納得しました。それはそれだけの価値がある。機能的なTreeViewサンプルが必要な場合、私は自分のコードを提供することができますが、私はコンテキストメニューを使用しませんでしたが、それはまだ役立つかもしれません。 –

+0

@AnthonyMason:あなたが作者があなたと話したい人ではない投稿のコメントセクションの誰かに話すなら、あなたは 'at'表記を使いたいと思うでしょう。さもなければあなたが対処しようとしている人には通知されません。 –

関連する問題