2012-04-01 2 views

Antwort

2

Anstatt an die Auflistung zu binden und einen Konverter zu verwenden, können Sie eine schreibgeschützte ItemNames-Eigenschaft verfügbar machen. Im Items.CollectionChanged Ereignishandler heben Sie ein Property Ereignis für die Elementnamen Eigenschaft

public class ViewModel 
{ 

     public ViewModel() 
     { 
      Items = new ObservableCollection<Item>(); 
      Items.CollectionChanged += (o, e) => NotifyPropertyChanged("ItemNames"); 
     } 
     public ObservableCollection<Item> Items { get; private set; } 
     public string ItemNames { get { return String.Join(",", Items); } } 
} 
+0

Was passiert, wenn die Klasse mit SVCutil erstellt wird? Würde ich das readonly auf der Klientenseite erzeugen. Was passiert, wenn ich die Daten vom Dienst empfange anstatt sie auf der Clientseite zu generieren? Wo würde ich die Ereignisse anbringen? –

+0

Auch die Sammlung, die geändert wird, ist in einer anderen Sammlung geschachtelt. –

+0

Ich habe es geschafft, indem ich einen Konstruktor gesetzt habe, der seinen eigenen Typ als Argument akzeptiert, dann die Werte kopiert und eine neue ObservableCollection erstellt und den NotifyPropertyChanged-Aufruf an das CollectionChanged-Ereignis anfügt, wie Sie es spezifiziert haben. Die Zeichenfolge wird aktualisiert. Ich benutze den Konstruktor nur einmal so, daher ist es sicher, neue Sammlung zu erstellen. Ich bin mir nicht sicher, ob dies der effektivste Weg ist, aber es funktioniert. Danke trotzdem. –

2

Ja, aber normalerweise würden Sie wegen des Overheads nicht so etwas tun wollen. Wenn Sie Steuerelemente mit einer ItemsSource verwenden, können Sie mit CollectionChanged umgehen, ohne alles neu zu erstellen.

+0

ich, dass Immobilien in Datacolumn eines Grid bin Bindung und unter Verwendung eines IValueConverter die ObservableCollection auf eine Comma Separated Zeichenfolge zu konvertieren. Ich weiß definitiv, dass dies nicht der richtige Weg ist, da ich nicht filtern kann. Ich weiß, dass dies in meiner Klasse als schreibgeschützte Eigenschaft geschehen kann. Wie benachrichtige ich, dass sich die Schreibgeschützt-Eigenschaft seit der Sammlung geändert hat hat sich verändert? –

+0

@ChristopherLeach: Abonnieren Sie einfach das CollectionChanged-Ereignis und feuern Sie ein PropertyChanged-Ereignis für die Eigenschaft ab, die die Zeichenfolge enthält. –

+0

Nur hickup ist, dass die Klasse von einem WCF-Dienst generiert wird. Ich habe versucht, eine partielle Klasse Client-Seite mit der schreibgeschützten Zeichenfolge-Eigenschaft zu generieren und den CollectionChanged-Ereignishandler anfügen, aber dies wird nicht über den Dienst seralisiert. Soll ich die WCF-Klassen in einer neuen Klasse erben und die Ereignisse dort verlinken? –