4

私は次のような階層データクラスを持っています

public class MyNode 
{
   public string Name { get; set;}
   public bool IsExpanded { get; set;}
   public List<MyNode> Nodes { get; set;}
}

MyNodeクラスをTreeViewにバインドするためにHierarchicalDataTemplateを定義できます。

<sdk:TreeView ItemsSource="{Binding RootNodes}">
  <sdk:TreeView.ItemTemplate>
    <sdk:HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
      <TextBlock Text="{Binding Name}" />
    </sdk:HierarchicalDataTemplate>
  </sdk:TreeView.ItemTemplate>
</sdk:TreeView>

問題は、TreeViewItemのIsExpandedプロパティを対応するMyNode.IsExpandedプロパティにデータバインドして、この情報を永続化する方法です。

よろしくお願いします、レックス

4

3 に答える 3

4

これがSilverlightで機能するかどうかはわかりませんが、WPFでは、次IsExpandedのスタイルを使用してバインドできます。

<sdk:TreeView ItemsSource="{Binding RootNodes}">
    <sdk:TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
        </Style>
    </sdk:TreeView.Resources>
    <sdk:TreeView.ItemTemplate>
        <sdk:HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
            <TextBlock Text="{Binding Name}" />
        </sdk:HierarchicalDataTemplate>
    </sdk:TreeView.ItemTemplate>
</sdk:TreeView>
于 2010-07-09T15:10:51.730 に答える
2

私は同じ問題に対処する必要があり、MVVMの方法で対処しました。

まず、ビューモデルでアイテムが展開されているかどうかを表すプロパティを作成します(主にMVVMが役立ちます)。

ノードのビューモデルに、のようなものを追加するだけですBoolean IsNodeExpanded { get; set; }
警告:上記は単なるインターフェースです!で変更を通知する必要があります。通知しINotifyPropertyChanged.PropertyChangedないと機能しません。

次に、それを自分のビューに接続します。これは、Andyがここで提案したものと非常によく似ています。スタイルを使用します。しかし、彼のマークアップは私には十分ではありませんでした(1つの理由はそれが機能しなかったことです)。
実際にやりたいのは、ツリービューのにスタイルを配置することですItemContainerStyle

<TreeView ...>
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="{Binding Path=IsNodeExpanded, Mode=TwoWay}" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

そして、これは私の場合はうまくいきました。


注1:頭痛の種を避け、上記のスタイルのバインディングが提示されているとおりに双方向バインディングであることを確認してください。しばらく前にプロジェクトをやり直さなければならなかったのですが、双方向にするのを忘れてしまい、デバッグすら役に立たなかったのです。

注2:この関数にはMVVMを使用する必要があります。再帰関数が必要なだけでなく、短く見え(怠惰です)、長い混乱であることが判明したため、コードビハインドを使用しようとしました。また、親が開かれるまで非表示のアイテムは存在しないように見えるためです。それは快適ではなく、それを行うための簡単な方法のように思えるかもしれませんが、私の経験はそれをはるかに長くしました。

于 2014-02-15T10:42:49.417 に答える
1

次のようにTreeViewクラスとTreeViewItemクラスをオーバーライドすると、次のようになります。

public class ExTreeView : System.Windows.Controls.TreeView
{
  protected override DependencyObject GetContainerForItemOverride()
  {
    return new ExTreeViewItem();
  }
}

public class ExTreeViewItem : System.Windows.Controls.TreeViewItem { public ExTreeViewItem() { SetBinding(IsExpandedProperty, new Binding("IsExpanded") { Mode = BindingMode.TwoWay }); }

protected override DependencyObject GetContainerForItemOverride() { return new ExTreeViewItem(); } }

次に、TreeViewの代わりにExTreeViewを使用すると、階層データ項目のIsExpandedプロパティにデータが自動的にバインドされます。

于 2010-11-25T15:44:50.927 に答える