如何在数据源列表更改时更新自定义依赖项属性

时间:2010-04-12 13:27:45

标签: c# .net wpf data-binding dependency-properties

我们有一个带有自定义依赖项属性(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
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

  1. 如果绑定到ObservableCollection,如果集合被其他集合替换,则会收到更改通知,而不是在集合的内容发生更改时。因此,您需要在代码隐藏中订阅CollectionChanged事件。
  2. 如果您订阅CollectionChanged,则可以查看ObservableCollection中的new/deleted items。您可以为每个new item添加新形状,并移除deleted items的旧形状。