Tag
속성이 특정 값으로 설정된 특정 TreeViewItem
을 찾으려고합니다. 부모 TreeViewItem
이 확장 된 경우 아래 FindNode
은 첫 번째 수준 항목 또는 다른 수준에서만 작동합니다. 아래 예제에서 "FFF"가 확장되면 FindNode
이 예상대로 작동합니다. 항목이 작성되지 않았으므로 ContainerFromItem
이 널 (null)을 리턴한다고 가정합니다. 모든 TreeViewItems의 생성을 강제하는 방법이 있습니까? 올바른 FindNode
구현이 hbarck의 답변에 따라 Tag 속성에서 특정 값을 가진 TreeViewItem을 찾으려면 어떻게합니까?
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
TreeViewItem a = FindNode(__items.ItemContainerGenerator, __items.Items, Node.H);
}
private TreeViewItem FindNode(ItemContainerGenerator gen, ItemCollection items, Node value)
{
TreeViewItem oResult = null;
foreach (var oItem in items)
{
TreeViewItem oTreeViewItem = (TreeViewItem)gen.ContainerFromItem(oItem);
if (oTreeViewItem == null) { continue; }
if ((Node)oTreeViewItem.Tag == value) { oResult = oTreeViewItem; break; }
if (oTreeViewItem.Items.Count > 0)
{
oResult = FindNode(oTreeViewItem.ItemContainerGenerator, oTreeViewItem.Items, value);
if (oResult != null) { break; }
}
}
return oResult;
}
}
public enum Node { A, B, C, D, E, F, G, H, I, J, }
<TreeView x:Name="__items">
<TreeViewItem Header="AAA"
Tag="{x:Static my:Node.A}" />
<TreeViewItem Header="BBB"
Tag="{x:Static my:Node.B}">
<!-- Items will be added later. -->
</TreeViewItem>
<TreeViewItem Header="CCC"
Tag="{x:Static my:Node.C}" />
<TreeViewItem Header="DDD"
Tag="{x:Static my:Node.D}" />
<TreeViewItem Header="EEE"
Tag="{x:Static my:Node.E}" />
<TreeViewItem Header="FFF"
Tag="{x:Static my:Node.F}">
<TreeViewItem Header="GGG"
Tag="{x:Static my:Node.G}" />
<TreeViewItem Header="HHH"
Tag="{x:Static my:Node.H}" />
</TreeViewItem>
<TreeViewItem Header="III"
Tag="{x:Static my:Node.I}" />
</TreeView>
:
private TreeViewItem FindNode(ItemCollection items, Node value)
{
TreeViewItem oResult = null;
foreach (var oItem in items)
{
TreeViewItem oTreeViewItem = (TreeViewItem)oItem;
if ((Node)oTreeViewItem.Tag == value) { oResult = oTreeViewItem; break; }
if (oTreeViewItem.Items.Count > 0)
{
oResult = FindNode(oTreeViewItem.Items, value);
if (oResult != null) { break; }
}
}
return oResult;
}
MVVM 패턴을 사용하지 않는 특별한 이유가 있습니까? WPFs TreeView는 MVVM과 함께 사용할 때 매우 잘 작동합니다. 그것을 다른 방식으로 사용하면 매우 못 생기고 '이것은 매우 힘들어, 아마도 나는 잘못된 것을하고있는 것입니다.'라는 느낌을 줄 수 있습니다. 특정 태그가있는 TreeViewItem을 찾을 때 코드에서 무엇을 할 계획입니까? – Stipo
내가 상속 한 레거시 코드. 뷰 모델을 받아들이 기 위해 코드 기반을 얻기 위해 스파게티를 교정하려고합니다. (현재 다중 뷰 모델과 코드 숨김이 혼합되어 있습니다.) 견적/미제공보기 모델에서 현재 하드 코딩되어 있기 때문에 항목을 찾아야합니다. – AMissico