WPF TreeView 내에서 TreeView 선택을 지우려면 어떻게해야합니까? TreeNodes
을 반복하면서 IsSelected
속성을 지우려고했으나 ReadOnly
속성입니다. 어떤 아이디어?WPF TreeView 지우기 선택
TreeView
은 XMLDataProvider
개체를 통해 XML 바인딩을 사용하고 있습니다.
WPF TreeView 내에서 TreeView 선택을 지우려면 어떻게해야합니까? TreeNodes
을 반복하면서 IsSelected
속성을 지우려고했으나 ReadOnly
속성입니다. 어떤 아이디어?WPF TreeView 지우기 선택
TreeView
은 XMLDataProvider
개체를 통해 XML 바인딩을 사용하고 있습니다.
TreeNodes의 의미를 명확히하지 못했습니다.
는 일반적으로 당신이보기에 결합 뷰 모델에 해당IsSelected
재산 것 : 따라서
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
을, 당신은 당신의보기 모델의 데이터 항목을 통해 단지 루프가 IsSelected = false
을 설정합니다.
그러나 이러한 속성이없는 것 같습니다. 그렇다면 각 데이터 항목에 해당하는 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;
}
}
내가 똑같은 문제를 가로 질러 와서 단 하나의 선으로, 어떤 트 리뷰에서 작동 다음과 같은 코드를 작성 첫 번째 함수를 호출하십시오.
class TomWrightsUtils
{
public static void ClearTreeViewSelection(TreeView tv)
{
if (tv != null)
ClearTreeViewItemsControlSelection(tv.Items, tv.ItemContainerGenerator);
}
private static void ClearTreeViewItemsControlSelection(ItemCollection ic, ItemContainerGenerator icg)
{
if ((ic != null) && (icg != null))
for (int i = 0; i < ic.Count; i++)
{
TreeViewItem tvi = icg.ContainerFromIndex(i) as TreeViewItem;
if (tvi != null)
{
ClearTreeViewItemsControlSelection(tvi.Items, tvi.ItemContainerGenerator);
tvi.IsSelected = false;
}
}
}
}
이 때까지 아무 일도 없었습니다. 완전한! 고맙습니다! – 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를 다룰 때 나를 놀라게했습니다. 나는 오랫동안 찾고 후 사용자 정의 트리 목록보기 구현이 상황에 자신을 실행중인
public static void ClearSelection(this TreeView input)
{
var selected = input.SelectedItem;
if (selected == null) return;
var tvi = input.ContainerFromItem(selected) as TreeViewItem;
if (tvi == null) return;
tvi.IsSelected = false;
}
public static TreeViewItem ContainerFromItem(this TreeView treeView, object item)
{
TreeViewItem containerThatMightContainItem = (TreeViewItem)treeView.ItemContainerGenerator.ContainerFromItem(item);
if (containerThatMightContainItem != null)
return containerThatMightContainItem;
else
return ContainerFromItem(treeView.ItemContainerGenerator, treeView.Items, item);
}
private static TreeViewItem ContainerFromItem(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, object item)
{
foreach (object curChildItem in itemCollection)
{
TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem);
if (parentContainer == null)
return null;
TreeViewItem containerThatMightContainItem = (TreeViewItem)parentContainer.ItemContainerGenerator.ContainerFromItem(item);
if (containerThatMightContainItem != null)
return containerThatMightContainItem;
TreeViewItem recursionResult = ContainerFromItem(parentContainer.ItemContainerGenerator, parentContainer.Items, item);
if (recursionResult != null)
return recursionResult;
}
return null;
}
호출 할 수 있도록
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 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