首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将DataTemplate绑定到DataGridColumn CellTemplate

将DataTemplate绑定到DataGridColumn CellTemplate
EN

Stack Overflow用户
提问于 2014-07-05 14:55:27
回答 1查看 1.2K关注 0票数 0

我试图在代码中设置一个DatePicker DataGrid列。该列与不同的DataGrids一起使用,每一列都显示不同类型的对象。我从这个职位中得到了以下代码,该代码工作正常:

代码语言:javascript
复制
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模板:

代码语言:javascript
复制
<DataTemplate x:Key="DatePickerColumnCellTemplate">
    <DatePicker SelectedDate="{Binding Path=StartDate}" />
</DataTemplate>

下面是新的GetDataGridColumn方法:

代码语言:javascript
复制
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的值。

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-06 17:35:33

由于没有出现任何答案,这就是我想出的解决办法。

我没有找到一种方法来连接XAML创建的模板的绑定,而是开始研究我试图做的事情--创建一个DatePicker DataGridColumn。因此,通过继承数据网格列的抽象基类,我创建了自己的DatePickerDataGridColumn类:

代码语言:javascript
复制
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方法变成:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24587636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档