0

コードで DatePicker DataGrid 列を設定しようとしています。この列は異なる DataGrid で使用され、それぞれが異なるタイプのオブジェクトを表示します。この投稿から、問題なく動作する次のコードを思いつきました。

public DataGridColumn GetDataGridColumn(string header, bool isReadOnly, string fieldName)
{
    DataGridTemplateColumn dgCol = new DataGridTemplateColumn();
    dgCol.Header = header;
    dgCol.IsReadOnly = isReadOnly;

    FrameworkElementFactory dateFactory = new FrameworkElementFactory(typeof(DatePicker));
    dateFactory.SetBinding(DatePicker.SelectedDateProperty, new Binding(fieldName));
    dateFactory.SetValue(DatePicker.IsEnabledProperty, !isReadOnly);

    DataTemplate cellTemplate = new DataTemplate();
    cellTemplate.VisualTree = dateFactory;

    dgCol.CellTemplate = cellTemplate;

    return dgCol;
}

ただし、プログラムでテンプレートを作成する方法FrameworkElementFactoryは推奨されていないため、別の方法を探すほうがよいと考えました。

別の方法として、一連の DataTemplates をリソースとして作成し、これらをコードに適用することを考えました。ここまでたどり着きましたが、バインディングの設定方法がわかりません。ここに私の DatePicker テンプレートがあります:

<DataTemplate x:Key="DatePickerColumnCellTemplate">
    <DatePicker SelectedDate="{Binding Path=StartDate}" />
</DataTemplate>

そして、ここに新しいGetDataGridColumn方法があります:

public DataGridColumn GetDataGridColumn(string header, bool isReadOnly, string fieldName)
{
    DataGridTemplateColumn dgCol = new DataGridTemplateColumn();
    dgCol.Header = header;
    dgCol.IsReadOnly = isReadOnly;

    dgCol.CellTemplate = (DataTemplate)Application.Current.FindResource("DatePickerColumnCellTemplate");

    return dgCol;
}

DatePicker 列の UI デザインが XAML で定義され、コードを使用してのみ適用されるようになったため、この新しいアプローチはより洗練されたソリューションのようです。ただし、現在、DatePicker 列には開始日のみが表示されます。メソッドのfieldName引数は、「StartDate」または「EndDate」、またはデータ グリッドに表示されているオブジェクトで定義されたその他の DateTime 変数です。また、DatePickerIsEnabledプロパティを isReadOnly の値に設定する方法もわかりません。

これが最善の方法ではないと思われる場合は、お知らせください。

ありがとう。

4

1 に答える 1

1

ここに答えが表示されていないので、私が思いついた解決策です。

XAML で作成されたテンプレートのバインディングを接続する方法が見つかりませんでしたが、代わりに、DatePicker DataGridColumn を作成しようとしていたことを調べ始めました。そこでDatePickerDataGridColumn、データ グリッド列の抽象基本クラスから継承して、独自のクラスを作成しました。

public class DatePickerDataGridColumn : DataGridColumn
{
    public DatePickerDataGridColumn() : base() { }

    public BindingBase SelectedDateBinding { get { return _selectedDateBinding; } set { _selectedDateBinding = value; } }
    private BindingBase _selectedDateBinding = null;

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem) { return null; }

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        DatePicker picker = new DatePicker();
        picker.IsEnabled = !IsReadOnly;
        picker.BorderThickness = new Thickness(0.0);

        if (SelectedDateBinding != null)
        {
            picker.SetBinding(DatePicker.SelectedDateProperty, SelectedDateBinding);
        }

        return picker;
    }
}

その後、私の GetDataGridColumn メソッドは次のようになりました。

public override DataGridColumn GetDataGridColumn(string header, bool isReadOnly, string fieldName)
{
    DatePickerDataGridColumn dgCol = new DatePickerDataGridColumn();
    dgCol.Header = header;
    dgCol.IsReadOnly = isReadOnly;

    Binding b = new Binding(fieldName);
    if (isReadOnly) { b.Mode = BindingMode.OneWay; }
    dgCol.SelectedDateBinding = b;

    return dgCol;
}
于 2014-07-06T17:35:33.133 に答える