我試圖找到特定的TreeViewItem
,其Tag
屬性設置爲特定值。如果父母TreeViewItem
已展開,以下FindNode
僅適用於一級項目或其他級別。在下面的示例中,如果「FFF」被展開,則FindNode
按預期工作。我假設ContainerFromItem
返回null,因爲項目尚未創建。有沒有辦法強制創建所有的TreeViewItems?如何在其Tag屬性中找到具有特定值的TreeViewItem
<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>
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, }
基於hbarck的答案正確FindNode
實現:
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模式有什麼特別的理由嗎? WPF的TreeView在與MVVM一起使用時效果很好。以另一種方式使用它可能非常難看,並給你一種'這太難了,我可能做錯了'的感覺。當你找到具有特定標籤的TreeViewItem時,你打算在代碼中做什麼? – Stipo
我繼承的遺留代碼。爲了接受視圖模型,我試圖理清spagetti以獲得代碼基礎。 (目前,有多個視圖模型和代碼隱藏的混合體。)我需要查找項目,因爲它們目前在報價/不引用視圖模型中進行了硬編碼。 – AMissico