WPFツリービュー内でTreeView選択をクリアするにはどうすればよいですか? TreeNodes
をループしてIsSelected
プロパティをクリアしようとしましたが、これはReadOnly
プロパティです。何か案は?WPFツリービュークリア選択
TreeView
は、XMLDataProvider
オブジェクトを使用してXMLバインディングを使用しています。
WPFツリービュー内でTreeView選択をクリアするにはどうすればよいですか? TreeNodes
をループしてIsSelected
プロパティをクリアしようとしましたが、これはReadOnly
プロパティです。何か案は?WPFツリービュークリア選択
TreeView
は、XMLDataProvider
オブジェクトを使用してXMLバインディングを使用しています。
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;
選択した項目を見つけて、値を設定します。
private void Button_Click(object sender, RoutedEventArgs e)
{
TreeViewItem tvi = treeviewExample.SelectedItem as TreeViewItem;
if (tvi != null)
{
tvi.IsSelected = false;
}
}
を私はまったく同じ問題に出くわしたと1行だけで、任意のツリービュー上で動作する次のコードを書きました最初の関数を呼び出します。
これまでは何も働いていませんでした。完璧!ありがとうございました! – StinkyCat
これまでのように動作しているようですが、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;
}
}
私のコードを無視してください。ルートレベルでのみ動作します。選択された子ノードはすべてクリアされません。 –
これは、拡張子の方法としてアウト素晴らしい作品+1。以下の拡張メソッドの組み合わせを使用します。 ContainerFromItem拡張メソッドは、MSDNのブログから来ており、TreeViewを扱う際に私にとって不思議に思っていました。
呼び出すことができるように
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;
}
}
}
私は、自分でカスタムツリーリストビューの実装を行っていましたが、長い間探してから、最終的に私のために働く解決策が見つかりました。
完全な説明は、基本的な考え方は、あなたが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;
}
私はちょうど同じ問題に出くわしました。
迅速かつ汚いソリューション
tree.ItemsSource = null;
tree.ItemsSource = yourSource;
TreeViewItem tvi = tvMain.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem;
if (tvi != null) { tvi.IsSelected = true; tvi.IsSelected = false; }
私は必死にツリービューの最初のインデックスを選択する方法を探しています。 上記の解決策(ContainerFromIndex)を試しましたが、nullを返します。 助けてください? – Shimmy