Infragistics|Ultimate UI for WPF|將 XamTreeGrid 節點的展開狀態綁定到模型的屬性

infragistics log


``將所有 XamTreeGrid 節點的初始狀態(事件控製版本) '' 擴展到行為版本,並且

  1. 將名為 RecordExpansionMemberPath 的屬性新增至行為中,以便您可以指定模型中的哪個屬性應設定或引用擴充狀態。
  2. 將 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 _subordinates;
    public ObservableCollection Subordinates
    {
        get { return _subordinates; }
        set { _subordinates = value; OnPropertyChanged(); }
    }

    // コンストラクター
    public Employee()
    {
    }
}

假定這是公司員工資料。假設它具有員工 ID、姓名和下屬訊息,並且可以使用第 24 至 28 行的 IsExpanded 屬性來設定和引用該節點的展開狀態。


行為

// InitialRecordExpansionBehavior.cs

public class InitialRecordExpansionBehavior : Behavior
{
    // 展開するかどうかを保持するプロパティ名を設定・取得するプロパティを追加します。
    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 行將屬性 IsExtanded(指示在視覺化樹上繪製記錄的 DataRecordPresenter 的展開狀態)綁定到模型屬性 IsExtanded。現在,顯示後由 UI 操作引起的展開/折疊狀態的變化將反映在模型端。

第 13 行到第 15 行新增了一些行為,以根據模型端 IsExpanded 屬性的值設定初始顯示時的展開/折疊狀態。




延伸閱讀
aa71435723的大頭照
Winston

Eggplant DAI 自動化測試專家。

留言