2011-10-31 94 views
1

我尝试在过去的一周左右进行自定义列的WPF数据网格自定义WPF DataGrid列

主要的一点是,有某些类型的数据,我在整个应用中的多个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

这怎么能改进?我所有的搜索一再表明XAML重做,这似乎是非常多余

同时我尝试做一个datepicker列,但不能找到一个可重复使用的列的任何样品,只是在每个数据网格重新定义再次

非常感谢你

编辑

IM现在尝试一个完全不同的方向

我犯了一个用户控件与下面的标记

<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" /> 

你怎么都做这些东西? 谢谢!

回答

3

您应该能够建立在你的应用程序的资源可重复使用的DataTemplate,则只需添加一个DataGridTemplateColumn指定CellTemplate

<DataGridTemplateColumn CellTemplate="{DynamicResource CustomColumnTemplate}" /> 
+0

与感谢。但如果我想添加自定义属性到我的列,我该怎么做?即我想添加一个MinAge属性,我可以设置MinAge =“10”,那么该列将只显示超过10岁的人。我可能还需要一些编码。我无法在一个资源中完成所有工作,我可以吗?谢谢! –

+0

@Yisman这将是一个更好的主意,将过滤器应用到您的DataGrid的ItemSource – Rachel

+0

我的意思是过滤组合框结果 –