【发布时间】:2014-08-29 19:51:02
【问题描述】:
我目前正在尝试使用DataGridTemplateColumn 创建一个自定义控件,该控件将在我们的许多应用程序中重复使用。我在获取自定义控件上的依赖属性以正确绑定和引发属性更改通知时遇到了一些问题。
我目前拥有从DataGridTemplateColumn 继承的控件,xaml 看起来像这样:
<DataGridTemplateColumn x:Class="Controls.DataGridDateColumn"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding SelectedDate}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<Grid FocusManager.FocusedElement="{Binding ElementName=DatePicker}">
<DatePicker Name="DatePicker" HorizontalAlignment="Left" VerticalAlignment="Center" SelectedDate="{Binding SelectedDate}"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
而后面的代码是这样的
public partial class DataGridDateColumn : DataGridTemplateColumn
{
public static readonly DependencyProperty SelectedDateProperty =
DependencyProperty.Register("SelectedDate",
typeof(DateTime?),
typeof(DataGridDateColumn),
new FrameworkPropertyMetadata(null, OnSelectedDateChanged));
private static void OnSelectedDateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DataGridDateColumn col = (DataGridDateColumn)d;
col.SelectedDate = (DateTime?)e.NewValue;
}
public DateTime? SelectedDate {
get {
return (DateTime?)GetValue(SelectedDateProperty);
}
set {
SetValue(SelectedDateProperty, value);
}
}
public DataGridDateColumn()
{
InitializeComponent();
}
}
当我在主页上的数据网格中拥有控件并尝试像这样绑定到 SelectedDate <Controls:DataGridDateColumn Header="Policy Date" SelectedDate="{Binding Path=PolicyDate}" SortMemberPath="PolicyDate" />
我在输出窗口中收到一个绑定错误,指出它找不到我所指的依赖项属性
System.Windows.Data Error: 40 : BindingExpression path error: 'SelectedDate' property not found on 'object' ''TestData' (HashCode=32071430)'. BindingExpression:Path=SelectedDate; DataItem='TestData' (HashCode=32071430); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
我最初的想法是,因为这是一个项目控件,所以我需要以不同于我的方式注册依赖属性,但我找不到任何其他信息。
我尝试创建自定义列的原因是因为我们计划将特定行为与几种不同类型的列相关联,以使我们所有应用的用户体验更加一致。所以我希望能够处理自定义控件内部的行为,这样我们就不必不断地将不同的事件连接到每个使用它的数据网格上的模板。
任何建议将不胜感激。
【问题讨论】:
标签: c# wpf custom-controls dependency-properties