自定义WPF DataGrid列

时间:2011-10-31 15:37:42

标签: wpf datagrid user-controls

我尝试过去一周左右为wpf datagrid制作自定义列

主要的一点是,我在应用程序中的多个数据网格中显示某些类型的数据,我不希望每次都重新声明所有属性

下面是一些反复使用的代码样本

<DataGridComboBoxColumn SelectedValueBinding="{Binding PersonID}" SelectedValuePath="PersonID" DisplayMemberPath="PersonName" Header="Customer" ItemsSource="{Binding Source={StaticResource PersonSource}}" />

所以我尝试制作像这样的用户控件

Public Class PersonColumn
Inherits DataGridComboBoxColumn
Sub New()
    SelectedValuePath = "PersonID"
    DisplayMemberPath = "PersonName"
    Header = "Customer"
End Sub
End Class

这是一个帮助,但不完整,因为

  1. 我不能做任何造型或其他标记工作
  2. 我似乎无法使用FindResource命令获取PersonSource
  3. 如何改进?我的所有搜索都会一次又一次地显示xaml redone,这看起来非常多余

    同时我试图创建一个datepicker列,但无法找到可重用列的任何样本,只需重新定义每个数据网格

    非常感谢

    修改

    我正在尝试一个完全不同的方向

    我使用以下标记进行了用户控制

    <DataGridTemplateColumn Header="Date" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"      xmlns:my="clr-namespace:SampleWpf"  x:Class="DateColumn">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:DateColumn}}, Path=Value}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <DatePicker SelectedDate="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:DateColumn}}, Path=Value}"  />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
    

    和一些代码隐藏

    Public Class DateColumn
    Inherits DataGridTemplateColumn
    Public Shared ReadOnly ValueProperty = DependencyProperty.Register("Value", GetType(Date?), GetType(DateColumn))
    Property Value As Date?
    End Class
    

    但这不起作用。日期未显示在列中,我的更改也未保存回数据源

    datagrid xaml很简单

                    <my:DateColumn   Value="{Binding Path=ReceivedOn}" Header="ReceivedOn" />
    
    你怎么都做这些东西? 谢谢十亿!

1 个答案:

答案 0 :(得分:3)

您应该可以在应用程序的资源中创建可重用的DataTemplate,然后只需添加具有指定DataGridTemplateColumn的{​​{1}}

CellTemplate
相关问题