XamDataGridでレコードフィルタのドロップダウンに独自のフィルタ条件を追加する方法を紹介します。RecordFilterDropDownPopulating イベントで FilterDropDownItem を追加し、ICondition を実装したカスタム条件クラスと組み合わせることで、既定の演算子だけでは表現できない条件(例: 期限切れまたは7日以内の未完了注文)でレコードを絞り込めるようになります。

XamDataGrid の設定

対象フィールドで AllowRecordFiltering を有効にし、RecordFilterDropDownPopulating イベントをハンドラーに接続します。

<igWPF:XamDataGrid x:Name="xamDataGrid1" DataSource="{Binding}"
                    RecordFilterDropDownPopulating="xamDataGrid1_RecordFilterDropDownPopulating">
    <igWPF:XamDataGrid.FieldLayoutSettings>
        <igWPF:FieldLayoutSettings AutoGenerateFields="False" />
    </igWPF:XamDataGrid.FieldLayoutSettings>
    <igWPF:XamDataGrid.FieldLayouts>
        <igWPF:FieldLayout>
            <igWPF:FieldLayout.FieldSettings>
                <igWPF:FieldSettings AllowRecordFiltering="True"/>
            </igWPF:FieldLayout.FieldSettings>
            <igWPF:FieldLayout.Fields>
                <igWPF:Field Name="OrderId" ... />
                <igWPF:Field Name="CustomerName" ... />
                <igWPF:Field Name="DueDate" Label="期限" />
                <igWPF:Field Name="Status" ... />
            </igWPF:FieldLayout.Fields>
        </igWPF:FieldLayout>
    </igWPF:XamDataGrid.FieldLayouts>
</igWPF:XamDataGrid>

RecordFilterDropDownPopulating イベントの処理

対象フィールドが DueDate の場合に既定のドロップダウン項目をクリアし、独自のラベルとカスタム条件を持つ FilterDropDownItem を追加します。

private void xamDataGrid1_RecordFilterDropDownPopulating(object sender, RecordFilterDropDownPopulatingEventArgs e)
{
    if (e.Field.Name == "DueDate")
    {
        e.DropDownItems.Clear();
        var item = new FilterDropDownItem(new MyCustomCondition(), "期限切れまたは今後7日以内の未完了注文");
        e.DropDownItems.Add(item);
    }
}

ICondition を実装したカスタム条件の作成

ICondition インターフェースを実装し、IsMatch メソッド内で任意の判定ロジックを記述します。ここでは、期限が7日以内(または過ぎている)かつステータスが「未完了」であるレコードのみを一致とみなしています。

public class MyCustomCondition : ICondition
{
    public bool IsMatch(object value, ConditionEvaluationContext context)
    {
        if (!(value is DateTime dueDate))
        {
            return false;
        }

        var cell = context.CurrentValue.Context as Cell;
        var order = cell?.Record?.DataItem as Order;

        return order != null
            && dueDate.Date <= DateTime.Today.AddDays(7)
            && order.Status == "未完了";
    }

    public object Clone()
    {
        return new MyCustomCondition();
    }
}

実行結果

フィルタドロップダウンを開くと、既定の演算子リストに加えて「期限切れまたは今後7日以内の未完了注文」という独自のフィルタ項目が表示されます。これを選択すると、ステータスが「未完了」かつ期限が7日以内(または過ぎている)のレコードのみが表示されます。

Tagged:

製品について

Ultimate UI for WPF