【发布时间】:2011-02-07 00:28:40
【问题描述】:
我们有一个带有自定义依赖属性 (DP) 的用户控件。 DP 绑定到 ObservableCollection。
当以编程方式将新项目添加到集合中时,数据绑定不会更新目标 DP。为什么?我们认为这是因为,不幸的是,在我们的例子中,目标不是 ListBox 或 ListView,而是 Canvas。 DP 在更改或初始化时应该在 Canvas 上绘制一个 Shape (!),并且 shape 的位置和大小绑定到集合项的两个属性:WIDTH、LEFT。
理想情况下,我们不想仅仅因为添加(或删除)一项就清除画布并重新绘制所有项目。但是怎么做呢?
所以: 自定义 DP 如何负责为新收藏项绘制形状?我们需要什么回调,这必须在什么时间点发生,可能会有哪些特定的 MetaDataOptions?
另外,关于所有这些依赖属性选项,是否有任何好的资源。他们很混乱。 MSDN 对我们正在尝试做的事情并没有真正的帮助。
谢谢!
编辑:
ObservableCollection 是这样的:
public class Projects : ObservableCollection<Project>
{
//no ommitted code. this class really IS empty!
}
DP是这样的:
public class MyUserControl : UserContorl
{
public static readonly DependencyProperty... etc. typeof(Projects)
private static void OnProjectsChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyUserControl u = d as MyUserControl;
CpProjectCollection projects = e.NewValue as CpProjectCollection;
u.Refresh(projects);
}
private void Refresh(CpProjectCollection projects)
{
foreach (CpProject p in projects)
{
//...add each project to the Canvas
ProjectContorl pc = new ProjectControl();
pc.Project = project;
Binding b = new Binding("StartTime");
b.Converter = new TimeSpanConverter();
b.Source = pc.Project;
b.Mode = BindingMode.TwoWay;
c.SetBinding(Canvas.LeftProperty, b);
//do the same for project duration
}
}
}
【问题讨论】:
标签: c# .net wpf data-binding dependency-properties