XamTreeGrid ノードを初期状態で全展開する (イベント制御版)」をビヘイビア版にし、さらに

  • RecordExpansionMemberPath というプロパティをビヘイビアに追加し、モデルのどのプロパティで展開状態を設定・参照するかを指定できるようにする。
  • DataRecordPresenter の IsExpanded プロパティをモデルのプロパティとバインドする。

ことで、モデルのプロパティとバインドできるようになります。

 

データモデル
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// 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()
{
}
}
// 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() { } }
// 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 プロパティでノードの展開状態を設定・参照できる、という想定です。

 

ビヘイビア
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// 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;
}
}
}
}
// 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; } } } }
// 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 ノードを初期状態で全展開する (イベント制御版)」と同じです。

 

ビュー
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<!-- 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>
<!-- 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>
<!-- 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:

製品について

Ultimate UI for WPF