【发布时间】:2011-10-31 15:37:42
【问题描述】:
我在过去一周左右尝试为 wpf 数据网格制作自定义列
重点是我在整个应用程序的多个数据网格中显示某些类型的数据,我不想每次都重新声明所有属性
这里是一些反复使用的代码示例
<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
这是一个帮助,但并不完整,因为
- 我不能做任何样式或其他标记工作
- 我似乎无法使用
FindResource命令获取 PersonSource
如何改进?我所有的搜索都显示 xaml redone 一次又一次,这似乎很多余
同时我试图创建一个日期选择器列,但找不到任何可重用列的样本,只是再次在每个数据网格中重新定义
非常感谢
编辑
我现在正在尝试一个完全不同的方向
我用以下标记制作了一个用户控件
<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" />
你们都是怎么做这些事情的? 谢谢十亿!
【问题讨论】:
标签: wpf datagrid user-controls