У нас есть пользовательский элемент управления с пользовательским свойством зависимости (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
}
}
}