「XamTreeGrid ノードを初期状態で全展開する (イベント制御版)」をビヘイビア版にし、さらに
- RecordExpansionMemberPath というプロパティをビヘイビアに追加し、モデルのどのプロパティで展開状態を設定・参照するかを指定できるようにする。
- DataRecordPresenter の IsExpanded プロパティをモデルのプロパティとバインドする。
ことで、モデルのプロパティとバインドできるようになります。
データモデル
// Employee.cs public class Employee : ObservableObject { // 従業員ID private int _employeeID; public int EmployeeID { get { return _employeeID; } set { _employeeID = value; OnPropertyChanged(); } } // 氏名 private String _name; public String Name { get { return _name; } set { _name = value; OnPropertyChanged(); } } // このノードを展開するかどうかのフラグ // このフラグをビューとバインドします。 private bool _isExpanded; public bool IsExpanded { get { return _isExpanded; } set { _isExpanded = value; OnPropertyChanged(); } } // 部下 private ObservableCollection<Employee> _subordinates; public ObservableCollection<Employee> Subordinates { get { return _subordinates; } set { _subordinates = value; OnPropertyChanged(); } } // コンストラクター public Employee() { } }
会社の従業員データという想定です。従業員ID、氏名、部下の情報を持ち、24 ~ 28 行目の IsExpanded プロパティでノードの展開状態を設定・参照できる、という想定です。
ビヘイビア
// InitialRecordExpansionBehavior.cs public class InitialRecordExpansionBehavior : Behavior<XamTreeGrid> { // 展開するかどうかを保持するプロパティ名を設定・取得するプロパティを追加します。 public string RecordExpansionMemberPath { get; set; } // InitializeRecordイベントのイベントハンドラーの登録と解除 protected override void OnAttached() { AssociatedObject.InitializeRecord += AssociatedObject_InitializeRecord; } protected override void OnDetaching() { AssociatedObject.InitializeRecord -= AssociatedObject_InitializeRecord; } // InitializeRecordイベントのイベントハンドラー private void AssociatedObject_InitializeRecord(object sender, Infragistics.Windows.DataPresenter.Events.InitializeRecordEventArgs e) { var dataRecord = e.Record as DataRecord; if (!string.IsNullOrEmpty(RecordExpansionMemberPath) && dataRecord != null && dataRecord.DataItem != null) { // RecordExpansionMemberPathで指定されたプロパティの値を取り出し、DataRecordのIsExpandedに設定します。 var pinfo = dataRecord.DataItem.GetType().GetProperty(RecordExpansionMemberPath); if (pinfo != null) { var result = (bool)pinfo.GetValue(dataRecord.DataItem, null); dataRecord.IsExpanded = result; } } } }
6 行目、展開状態を設定・参照するモデル側のプロパティ名を指定するプロパティとして RecordExpansionMemberPath を定義しています。
25 ~ 30 行目で、RecordExpansionMemberPath で指定されたプロパティから値を取り出し、DataRecord の IsExpanded プロパティの値を設定しています。
InitializeRecord イベントの登録・解除は、「XamTreeGrid ノードを初期状態で全展開する (イベント制御版)」と同じです。
ビュー
<!-- MainWindow.xaml --> <igDP:XamTreeGrid x:Name="xamTreeGrid1" DataSource="{Binding Employees}"> <igDP:XamTreeGrid.Resources> <!-- DataRecordPresenterのIsExpandedプロパティとデータモデルのIsExpandedプロパティとをバインドします --> <Style TargetType="{x:Type igDP:DataRecordPresenter}"> <Setter Property="IsExpanded" Value="{Binding Path=DataItem.IsExpanded, Mode=TwoWay}"/> </Style> </igDP:XamTreeGrid.Resources> <!-- ビヘイビアを追加し、RecordExpansionMemberPathプロパティにデータモデルのIsExpandedプロパティを指定します。 --> <i:Interaction.Behaviors> <local:InitialRecordExpansionBehavior RecordExpansionMemberPath="IsExpanded"/> </i:Interaction.Behaviors> </igDP:XamTreeGrid>
7 ~ 9 行目、ビジュアルツリー上でレコードを描画している DataRecordPresenter の展開状態を示すプロパティ IsExtanded をモデルのプロパティ IsExtanded とバインドしています。これで、表示後の UI 操作による展開/折り畳み状態の変化がモデル側にも反映されるようになります。
13 ~ 15 行目、ビヘイビアを追加し、モデル側の IsExpanded プロパティの値に応じて初期表示時の展開/折り畳み状態が設定されるようにしています。
結果
IsExpanded の値に従ってノードの展開/非展開がされるようになりました!
APIリファレンス
- InitializeRecord イベント
- IsExpanded プロパティ