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リファレンス

 

Tagged: