2009-03-24 28 views
7

WPFツリービュー内でTreeView選択をクリアするにはどうすればよいですか? TreeNodesをループしてIsSelectedプロパティをクリアしようとしましたが、これはReadOnlyプロパティです。何か案は?WPFツリービュークリア選択

TreeViewは、XMLDataProviderオブジェクトを使用してXMLバインディングを使用しています。

答えて

8

TreeNodesの意味を理解できていません。したがって、あなたはあなたのビューモデルのデータ項目によってちょうどループだろうし、そこIsSelected = falseを設定

<TreeView> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

通常は、あなたのビューがに結合するビューモデルに対応するIsSelected性質を持っているでしょう。

ただし、このようなプロパティがないようです。その場合、各データ項目に対応するTreeViewItemを取得する必要があります。これを行う方法については、TreeView.ItemContainerGeneratorプロパティを参照してください。ような何か:

var treeViewItem = _treeView.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem; 
treeViewItem.IsSelected = false; 
+1

私は必死にツリービューの最初のインデックスを選択する方法を探しています。 上記の解決策(ContainerFromIndex)を試しましたが、nullを返します。 助けてください? – Shimmy

2

選択した項目を見つけて、値を設定します。

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem tvi = treeviewExample.SelectedItem as TreeViewItem; 
    if (tvi != null) 
    { 
    tvi.IsSelected = false; 
    } 
} 
10

を私はまったく同じ問題に出くわしたと1行だけで、任意のツリービュー上で動作する次のコードを書きました最初の関数を呼び出します。

+1

これまでは何も働いていませんでした。完璧!ありがとうございました! – StinkyCat

0

これまでのように動作しているようですが、5分前のように入れておきますので、自己責任で使用してください。私は基本的に、ユーザーがツリーコントロール内をクリックしたときに選択項目をクリアしたいが、ツリー項目ではクリックしないようにしたかった。あなたは標準いるItemContainerGeneratorから離れて滞在する私の経験をされて、彼らがnより大きい深さでのノード上で失敗するので呼び出しています

youTreeview.ClearSelection(); 

using System.Windows.Forms; 
using System.Windows.Controls; 

namespace YourAppNamespace 
{ 
    public static void ClearSelection(this TreeView input) 
    { 
    // this should be some container that you put in 
    // possibly the actual treeviewitem, not sure on that though 
    var selected = input.SelectedItem; 
    if (selected == null) 
     return; 

    // in my case this works perfectly 
    var tvi = input.ItemContainerGenerator.ContainerFromItem(selected) as TreeViewItem; 
    var tvi = input.ItemContainerGenerator.ContainerFromItem(selected) as TreeViewItem; 
    if (tvi == null) 
    { 
     // it must be a child, heres a hack fix 
     // my nodes are inherited from TreeViewItemViewModel by Josh Smith 
     var child = selected as WPF.Controls.TreeViewItemViewModel; 
     if (child == null) 
      return; 
     child.IsSelected = false; 

    } 
    else 
     tvi.IsSelected = false; 
    } 


} 
+0

私のコードを無視してください。ルートレベルでのみ動作します。選択された子ノードはすべてクリアされません。 –

2

これは、拡張子の方法としてアウト素晴らしい作品+1。以下の拡張メソッドの組み合わせを使用します。 ContainerFromItem拡張メソッドは、MSDNのブログから来ており、TreeViewを扱う際に私にとって不思議に思っていました。

1

呼び出すことができるように

void DestinationTree_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    TreeView tree = sender as TreeView; 
    DestinationClientViewModel selectedItem = tree.SelectedItem as DestinationClientViewModel; 

    if (selectedItem != null) 
    { 
     int selectedItemIndex = this.DestinationTree.Items.IndexOf(selectedItem); 

     if (selectedItemIndex > -1) 
     { 
      TreeViewItem tvi = this.DestinationTree.ItemContainerGenerator.ContainerFromIndex(selectedItemIndex) as TreeViewItem; 
      if (tvi != null) 
       tvi.IsSelected = false; 
     } 
    } 
} 
0

私は、自分でカスタムツリーリストビューの実装を行っていましたが、長い間探してから、最終的に私のために働く解決策が見つかりました。

完全な説明は、基本的な考え方は、あなたがTreeViewItem.Selectedイベントをキャプチャし、あなたのツリービュー上Tag属性にイベントのソースを保存しているhttp://social.msdn.microsoft.com/Forums/vstudio/en-US/36aca7f7-0b47-488b-8e16-840b86addfa3/getting-treeviewitem-for-the-selected-item-in-a-treeview

で見つけることができます。次に、それをクリアする必要があるときは、コントロールのTag属性にアクセスし、IsSelectedの値をFalseに設定します。これは2段階のネストされた子どものために私のために働く。うまくいけばそれはあなたのために働くでしょう。永続便宜上

TreeViewコントロールの宣言

<TreeView Name="myTreeView" TreeViewItem.Selected="OnItemSelected" 
    ItemsSource="{Binding Source={StaticResource myHierarchicalData}}"/> 

イベントハンドラ

private void OnItemSelected(object sender, RoutedEventArgs e) 
{ 
    myTreeView.Tag = e.OriginalSource; 
} 

クリア選択ロジック

if (myTreeView.SelectedItem != null) 
{ 
    TreeViewItem selectedTVI = myTreeView.Tag as TreeViewItem; 
    // add your code here mine was selectedTVI.IsSelected = false; 
} 
0

私はちょうど同じ問題に出くわしました。

迅速かつ汚いソリューション

tree.ItemsSource = null; 

tree.ItemsSource = yourSource; 
0
TreeViewItem tvi = tvMain.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem; 

if (tvi != null) { tvi.IsSelected = true; tvi.IsSelected = false; } 
関連する問題