我们有一个带有自定义依赖项属性(DP)的用户控件。 DP绑定到ObservableCollection。
当以编程方式将新项目添加到集合时,数据绑定不会更新目标DP。为什么?我们认为这是因为,不幸的是,在我们的例子中,目标不是ListBox或ListView,而是Canvas。当更改或初始化时,DP应该在Canvas上绘制一个Shape(!),并且形状的位置和大小绑定到集合项的两个属性:WIDTH,LEFT。
理想情况下,我们不想清除Canvas并重绘所有项目,因为已经添加(或删除)了一个项目。但是如何?
所以: 自定义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
}
}
}
答案 0 :(得分:1)
ObservableCollection
,如果集合被其他集合替换,则会收到更改通知,而不是在集合的内容发生更改时。因此,您需要在代码隐藏中订阅CollectionChanged
事件。CollectionChanged
,则可以查看ObservableCollection
中的new/deleted items。您可以为每个new item添加新形状,并移除deleted items的旧形状。