2010-04-12 4 views
1

Nous avons un contrôle utilisateur avec une propriété de dépendance personnalisée (DP). Le DP est lié à une ObservableCollection.Comment mettre à jour une propriété de dépendance personnalisée lorsque la liste de sources de données change

Lorsqu'un nouvel élément est ajouté à la collection par programmation, la liaison de données ne met pas à jour le point de détection cible. Pourquoi? Nous pensons que c'est parce que, malheureusement, dans notre cas, la cible n'est pas un ListBox ou un ListView, mais un Canvas. Le DP, lorsqu'il est modifié ou initialisé, est supposé dessiner une forme (!) Sur le canevas, et la position et la taille de la forme sont liées aux deux propriétés de l'élément de collection: WIDTH, LEFT.

Idéalement, nous ne voulons pas effacer le Canevas et redessiner tous les éléments juste parce que l'un a été ajouté (ou supprimé). Mais comment?

Donc: Comment le point de vente personnalisé peut-il prendre en charge le dessin de la forme pour le nouvel élément de collection? De quel callback avons-nous besoin, à quel moment cela doit-il arriver, et quelles sont les MetaDataOptions spécifiques qui peuvent exister?

De plus, y a-t-il de bonnes ressources concernant toutes ces options de propriétés de dépendance? Ils sont assez confus. MSDN n'aide pas vraiment avec ce que nous essayons de faire.

Merci!

EDIT:

Le ObservableCollection est comme ceci:

public class Projects : ObservableCollection<Project> 
{ 
    //no ommitted code. this class really IS empty! 
} 

Le DP est comme ceci:

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 
      } 
     } 
    } 

Répondre

1
  1. Si vous liez à ObservableCollection, vous obtenez la notification de changement si la collection est remplacée par une autre collection, pas lorsque le contenu de la collection est modifié. Donc, vous devrez vous abonner à l'événement CollectionChanged dans votre code-behind.
  2. Si vous êtes abonné à CollectionChanged, vous pouvez voir quels sont les new/deleted items dans votre ObservableCollection. Vous pouvez ajouter une nouvelle forme pour chaque new item et supprimer les anciennes formes pour deleted items.
+0

Ok! C'est la première étape ... mais si le DP est lié à la collection, quand et où ajouterais-je l'objet affecté à la toile? Est-ce que cela arrive dans un rappel, ou ai-je besoin de certaines MetaDataOptions, ou une combinaison des deux? Je n'ai aucune idée de la façon dont cela est censé fonctionner. En outre, si le canevas contient 10 formes et qu'un élément de collection est supprimé, comment puis-je savoir laquelle des 10 formes représente l'élément supprimé? – John

+0

A la réflexion, non, le ObservableCollection implémente déjà INotifyCollectionChanged, et avec ça il déclenche l'événement CollectionChanged quand un élément est ajouté ou supprimé! Ceci est censé être le comportement par défaut. Que faisons-nous mal ici? – John

+0

@John: abonnez-vous à l'événement 'CollectionChanged'? Peut-être que vous pouvez poster votre code et dire ce qui ne va pas? Si vous venez de lier quelque chose à un 'ObservableCollection', la liaison n'écoutera pas' CollectionChanged'. :-( – Vlad

Questions connexes