2

SOにはこのタイプの質問がたくさんありますが、すべて答えられているので、すぐに新しい質問を作成することにしました。タイトルはかなり自明なので、ここに問題があります。ツリー表示:

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
            <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
            <Setter Property="FontWeight" Value="Normal" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="FontWeight" Value="Bold" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TreeView.Resources>
</TreeView>

HierarchicalDataTemplate:

var labelFactory = new FrameworkElementFactory(typeof(TextBlock));
var template = new HierarchicalDataTemplate(typeof(Node)) { ItemsSource = new Binding("Children") };
labelFactory.SetBinding(TextBlock.TextProperty, new Binding("Text"));
template.VisualTree = labelFactory;
treeView.ItemTemplate = template;

私がバインドしているタイプ:

public class Node
{
    public List<Node> Children { get; set; }

    public Node Parent { get; set; }

    public bool IsSelected { get; set; }
    public bool IsExpanded { get; set; }
}

実際のバインディング、階層を適切に表示するために必要な空白のルート:

var hierarchy = Helpers.GetHierarchy();
var rootNode = new Node();
rootNode.Children.Add(hierarchy);
GVSObjectStructureTreeView.ItemsSource = rootNode.Children;

プログラムで特定のアイテムを選択/拡張する必要がありますが、

var itemToSelect = FindTreeViewItem(treeView.ItemsSource as List<Node>, elementId);
itemToSelect.IsSelected = true;

何も起こりません。拡張についても同じです。問題はバインディングにあると思いますが、理解できません。助けてくれてありがとう。

4

2 に答える 2

2

書き直されたサービスクラスと問題が解決されました。これが私が実装した2つの再帰的階層ヘルパーです(他の誰かに役立つかもしれません):

 private static Node FindTreeViewItem(IEnumerable<Node> treeViewItems, string key)
 {
      if (treeViewItems == null) return null;
      foreach (var item in treeViewItems)
      {
         if (item.AssociatedObject.ID.Equals(key))
         {
            return item;
         }
         if (item.Children != null)
         {
            var childItem = FindTreeViewItem(item.Children, key);
            if (childItem != null)
            {
               return childItem;
            }
         }
      }
      return null;
 }

 private static void ExpandTreeViewItemParents(Node treeViewItem)
 {
     if (treeViewItem == null) return;
     if (treeViewItem.Parent != null)
     {
         treeViewItem.Parent.IsExpanded = true;
     }
     ExpandTreeViewItemParents(treeViewItem.Parent);
 }

クリックハンドラーで次のように使用されます。

var selectedItem = FindTreeViewItem(treeView.ItemsSource as List<Node>, ID);
if (selectedItem != null)
{
     selectedItem.IsSelected = true;
     ExpandTreeViewItemParents(selectedItem);
}
于 2012-05-05T11:33:49.627 に答える
1

クラスが実装 INotifyPropertyChangedしているようには見えないので、簡潔にするためにそれを省略しない限り、バインディングが正しい場合でも何も起こりません。

于 2012-04-23T14:00:20.483 に答える