Tag
プロパティが特定の値に設定されている特定のTreeViewItem
を検索しようとしています。 FindNode
は、親がTreeViewItem
が展開されている場合、最初のレベルのアイテムまたは他のレベルでのみ機能します。次の例では、 "FFF"を展開すると、FindNode
が期待通りに機能します。アイテムが作成されていないため、ContainerFromItem
がnullを返すと仮定しています。すべてのTreeViewItemを強制的に作成する方法はありますか?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
継承した従来のコード。私はビューモデルを受け入れるためにコードベースを形にするためにスパゲッティをまっすぐにしようとしています。 (現在、複数のビューモデルとコードビハインドが混在しています)。現在、引用符/引用符で囲まれていないビューモデルではハードコードされているため、アイテムを探す必要があります。 – AMissico