【问题标题】:Binding DataTemplate to DataGridColumn CellTemplate将 DataTemplate 绑定到 DataGridColumn CellTemplate
【发布时间】:2014-08-26 13:55:51
【问题描述】:

我正在尝试在代码中设置 DatePicker DataGrid 列。此列与不同的 DataGrids 一起使用,每个 DataGrids 显示不同类型的对象。从this post 我想出了以下代码,它可以正常工作:

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;
}

但是,由于FrameworkElementFactorya deprecated way to programmatically create templates,所以我认为我最好寻找另一种方法。

作为替代方案,我考虑创建一组 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 的值。

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

谢谢。

【问题讨论】:

    标签: c# wpf binding datatemplate datagridcolumn


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 2018-09-30
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多