Как обновить пользовательское свойство зависимости при изменении списка источника данных - PullRequest
1 голос
/ 12 апреля 2010

У нас есть пользовательский элемент управления с пользовательским свойством зависимости (DP). DP связан с ObservableCollection.

Когда программно добавляется новый элемент в коллекцию, привязка данных не обновляет целевой DP. Зачем? Мы думаем, что это потому, что, к сожалению, в нашем случае целью является не ListBox или ListView, а Canvas. DP, при изменении или инициализации, должен нарисовать фигуру (!) На холсте, а позиция и размер фигуры привязаны к двум свойствам элемента коллекции: WIDTH, LEFT.

В идеале мы не хотим очищать холст и перерисовывать все элементы только потому, что один был добавлен (или удален). Но как?

Итак: Как пользовательский DP может позаботиться о рисовании формы для нового элемента коллекции? Какой обратный вызов нам нужен, в какой момент времени это должно произойти, и какие конкретные метаданные могут возникнуть?

Кроме того, есть ли хорошие ресурсы, касающиеся всех этих параметров свойств зависимостей. Они довольно запутанные. MSDN не очень помогает в том, что мы пытаемся сделать.

Спасибо!

EDIT:

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 Ответ

1 голос
/ 12 апреля 2010
  1. Если вы связываетесь с ObservableCollection, вы получаете уведомление об изменении, если коллекция заменяется другой коллекцией, а не при изменении содержимого коллекции. Итак, вам нужно подписаться на событие CollectionChanged в своем коде.
  2. Если вы подпишетесь на CollectionChanged, вы увидите, какие новые / удаленные элементы в вашем ObservableCollection. Вы можете добавить новую форму для каждого нового элемента и удалить старые формы для удаленных элементов .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...