Ist es für mich möglich, eine ObservableCollection als Eigenschaft in einer Klasse zu haben, aber ihr CollectionChanged-Ereignis zu abonnieren und OnPropertyChanged für die ObservableCollection-Eigenschaft aufzurufen, um eine UI-Bindung an die Sammlung zu aktualisieren? -Ist NotifyChanged für eine ObservableCollection-Eigenschaft über das CollectionChanged-Ereignis möglich?
Antwort
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); } }
}
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.
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? –
@ChristopherLeach: Abonnieren Sie einfach das CollectionChanged-Ereignis und feuern Sie ein PropertyChanged-Ereignis für die Eigenschaft ab, die die Zeichenfolge enthält. –
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? –
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? –
Auch die Sammlung, die geändert wird, ist in einer anderen Sammlung geschachtelt. –
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. –