繁体   English   中英

将DataTemplate绑定到DataGridColumn CellTemplate

[英]Binding DataTemplate to DataGridColumn CellTemplate

我正在尝试在代码中设置DatePicker DataGrid列。 该列与不同的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变量。 另外,我不确定如何将DatePicker IsEnabled属性设置为isReadOnly的值。

如果您认为这不是最好的方法,请告诉我。

谢谢。

由于没有答案,这是我想出的解决方案。

我没有找到为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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM