2009-09-22 8 views
0

Je souhaite implémenter une collection observable avec clé dans Silverlight, qui stockera des objets uniques basés sur une propriété appelée Nom. Une façon de le faire est d'utiliser la classe ObservableCollectionEx (échantillons dans un autre post stackoverflow) qui s'abonne à tous les événements PropertyChanged sur les elemens contenus et vérifie si la propriété name change. Mieux encore, créez mon propre événement qui me dira que l'attribut name a changé et que je lance une exception ValidationException si l'élément existe déjà. Je ne veux pas nécessairement récupérer l'objet avec un indexeur ce [Nom].ObservableCollection à clé dans Silverlight

somthing comme ceci:

private string name; 
public string Name 
{ 
    get { return name; } 
    set { 
     if (value != name) 
     { 
       OnNameChanged(); 
       name = value; 
       OnPropertyChanged("Name"); 
     } 

    } 
} 

Y at-il une autre solution plus élégante? Beaucoup plus simple? Merci, Adrian

P.S. Je sais qu'il y a aussi un ObservableDictionary que le Dr Wpf a mis en place et qu'il est facile de le déplacer vers Silvelight, mais je ne sais pas comment l'utiliser avec DataForm et autres.

Répondre

1

ObservableDictionary(Of TKey, TValue) - VB.NET

liste des fonctionnalités générales:

  • ObservableDictionary (Of TKey, TValue)
  • AddRange n'est notifié qu'une seule fois.
  • Generic EventArgs (Of TKey, TValue)
  • NotifyDictionaryChanging (Of ​​TKey, TValue) - une sous-classe de CancelEventArgs qui permet l'annulation de l'opération.
+1

Sauf qu'il n'implémente pas INotifyCollectionChanged. Cela semble nécessaire pour la liaison. –

2

Si je comprends bien, vous devez créer un KeyValuePair avec la mise en œuvre PropertyChanged et l'utiliser avec ObservableCollection

ObservableCollection< KeyValuePair<string,string>> 

public class KeyValuePair<TKey, TValue> : INotifyPropertyChanged 
{ 
    public KeyValuePair(TKey key, TValue value) 
    { 
     _key = key; 
     _value = value; 
    } 

    public TKey Key { get { return _key; } } 

    public TValue Value { get { return _value; } 
     set 
     { 
      _value = value; 
      NotifyPropertyChanged("Value"); 
     } 
    } 


    private TKey _key; 
    private TValue _value; 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 
} 
+0

Non, pas vraiment. Ce que je veux, c'est pouvoir empêcher un utilisateur d'ajouter deux objets avec la même valeur pour le nom de propriété. Ou au moins, je devrais être capable de réagir avant de permettre à l'utilisateur de conserver le changement de la propriété Name. Tout comme dans une base de données basée sur la clé primaire (clé unique d'ailleurs). –