【发布时间】:2013-06-02 11:31:39
【问题描述】:
我有以下自定义数据网格列,用于将 DatePart 依赖属性的值作为 ConverterParameter 传递给编辑元素的转换器:
Public Class DataGridTimeColumn
Inherits DataGridTextColumn
Shared ReadOnly DatePartProperty = DependencyProperty.Register("DatePart", GetType(DateTime?), GetType(DataGridTimeColumn), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, AddressOf RefreshBinding))
Property DatePart As DateTime?
Get
Return GetValue(DatePartProperty)
End Get
Set(value As DateTime?)
SetValue(DatePartProperty, value)
End Set
End Property
Private Shared Sub RefreshBinding(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
Dim tc As DataGridTimeColumn = d
tc.Binding = tc.Binding
End Sub
Public Overrides Property Binding As BindingBase
Get
Return MyBase.Binding
End Get
Set(value As BindingBase)
Dim b As Data.Binding = value
With b
.Converter = New TimeConverter
.ConverterParameter = DatePart
End With
MyBase.Binding = b
End Set
End Property
End Class
使用以下 XAML:
<my:DataGridTimeColumn Header="From" Binding="{Binding FromDate}" DatePart="{Binding FromDate}" />
<my:DataGridTimeColumn Header="Until" Binding="{Binding TillDate}" DatePart="{Binding TillDate}" />
但是RefreshBinding 永远不会被调用(我设置了一个断点并且它从未被触发),因此当设置ConverterParameter 时DatePart 总是Nothing(null)。我该如何解决这个问题?
编辑
在 C# 中:
public class DataGridTimeColumn : DataGridTextColumn
{
static readonly DependencyProperty DatePartProperty = DependencyProperty.Register(
"DatePart", typeof(DateTime?), typeof(DataGridTimeColumn),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, RefreshBinding)
);
public DateTime? DatePart
{
get { return (DateTime?)GetValue(DatePartProperty); }
set { SetValue(DatePartProperty, value); }
}
private static void RefreshBinding(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var tc = (DataGridTimeColumn)d;
tc.Binding = tc.Binding;
}
public override System.Windows.Data.BindingBase Binding
{
get { return base.Binding; }
set
{
var b = (Binding)value;
b.Converter = new TimeConverter();
b.ConverterParameter = DatePart;
base.Binding = b;
}
}
}
【问题讨论】:
-
您是否为
FromDate和TillDate属性实现了INotifyPropertyChanged? -
中的列不是可视化树的一部分,因此它们没有连接 DataContex。如果您在调试时查看输出窗口,您应该会看到类似“找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement...”之类的错误 -
在这里查看可能的解决方案:stackoverflow.com/questions/7660967/…
-
@Clemens - 不,我没有实现 INPC;我试试看。
-
@AdrianFaciu 我知道我不能通过绑定 DataGridColumn 中的属性来绑定生成元素中的任何属性。我正在尝试绑定 DataGridColumn 的属性,并且对绑定源的任何更改都应导致设置绑定的 ConverterParameter。假设尚未生成数据网格的元素,它们应该使用带有 ConverterParameter 的新绑定,因为绑定已复制/克隆到生成的元素。
标签: wpf data-binding dependency-properties datagridcolumn