Ich versuche, ein Listenfeld zu einer Sammelstelle zu binden. Das Problem besteht darin, dass sich die Auflistung ändern kann, die Auflistung jedoch keine IObservableCollection implementiert. Was ist der beste Weg, um die Bindung zu aktualisieren?-Update eine Bindung, die nicht IObservable Sammlung nicht implementiert
Antwort
Wie Tormod vorgeschlagen hat, würden die bevorzugten Methoden die Auflistung in eine ObservableCollection ändern oder die Implementierung von INotifyCollectionChanged in der Sammlung würde die Aktualisierung der Benutzeroberfläche übernehmen.
Wenn jedoch diese Optionen nicht verfügbar sind, dann können Sie ‚Kraft‘ eine Auffrischung durch INotifyPropertyChanged Verwendung in welcher Klasse die Sammlung enthält. Wir behandeln die Liste dann wie eine normale Eigenschaft und verwenden den Setter, um über Änderungen zu informieren. Um dies zu tun, muss der Verweis neu zugewiesen werden. Aus diesem Grund wird die Verwendung einer ObservableCollection bevorzugt, ebenso wie das PropertyChanged-Ereignis.
Hier ist eine kurze Probe zeigt, wie dies mit nur einer Standard-generic-Liste durchgeführt werden kann:
public partial class Window1 : Window, INotifyPropertyChanged
{
public Window1()
{
InitializeComponent();
this.Names = new List<string>() { "Mike", "Robert" };
this.DataContext = this;
}
private IList<string> myNames;
public IList<string> Names
{
get
{
return this.myNames;
}
set
{
this.myNames = value;
this.NotifyPropertyChanged("Names");
}
}
private void OnAddName(object sender, RoutedEventArgs e)
{
Names.Add("Kevin");
Names = Names.ToList();
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
XAML:
<Window x:Class="Sample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
Height="300"
Width="300">
<Grid>
<StackPanel>
<ListBox ItemsSource="{Binding Names}" />
<Button Content="Add Name"
Click="OnAddName" />
</StackPanel>
</Grid>
Ohne weitere Informationen darüber, wie und wo diese Sammlung verwendet wird, hier sind einige Hinweise, die Ihnen helfen können.
- Wenn die Sammlung nicht versiegelt ist, können Sie sie erben.
- Wenn die Sammlung abgeschlossen ist, können Sie einen Adapter Klasse erstellen, die eine Instanz Ihrer Sammlung enthält und wickelt alle relevanten Methoden.
In jedem Fall könnte Ihre neue Klasse IObservableCollection
implementieren und zum Binden verwendet werden.
Sie können festlegen, eine explizit zu aktualisieren Bindung an und dann eine Aktualisierung durch Code auslösen, indem man beispielsweise eine Aktualisierungsschaltfläche hat.
Als ein Beispiel.
<StackPanel>
<ListBox
x:Name="lb"
ItemsSource="{Binding SomeList, UpdateSourceTrigger=Explicit}"
/>
<Button Content="Refresh" Click="Refresh_Click" />
</StackPanel>
private void Refresh_Click(object sender, RoutedEventArgs e)
{
BindingExpression be = lb.GetBindingExpression(ListBox.ItemsSourceProperty);
be.UpdateSource();
}
Sie können auch eine Aktualisierung in Ihrem ViewModel erzwingen. Dies ist sth ich Josh Smith in seiner MVVM Demo-Anwendung tun gesehen haben:
ICollectionView coll = CollectionViewSource.GetDefaultView(myCollection);
if (coll!=null)
coll.Refresh();
myCollection kann jede Art von Sammlung, die Sie an die View gebunden haben.
Bea Stöllnitz hat ein bisschen mehr Informationen über Collection: http://www.beacosta.com/blog/?m=200608
- 1. Nicht Javascript Fehler in IE7 implementiert, wenn die Funktion Bindung
- 2. Bindung in GroupStyle-Header nicht aktualisiert, wenn die Sammlung ändert
- 3. Polymer berechnete Bindung wird nicht auf Update
- 4. Knockout benutzerdefinierte Bindung Update-Funktion nicht feuern
- 5. Knockout benutzerdefinierte Bindung Update nicht funktioniert
- 6. JQueryUI DataTable Sammlung Bindung Problem
- 7. Kann nicht eine Sammlung POST
- 8. C# nicht Bindung arbeiten
- 9. Die Sammlung wurde nicht initialisiert
- 10. Ember 2.6 Button Aktion Bindung nicht auslösen Vorlage Update
- 11. Update-Sammlung in Pymongo
- 12. IQueryable implementiert IDbAsyncEnumerable nicht
- 13. WPF-Update-Bindung in einem Hintergrund Thread
- 14. Konnte Daten in eine Sammlung nicht einfügen
- 15. Wie implementiert eine Schnittstelle die Funktionalität?
- 16. svn update nicht update
- 17. Modell eine Sammlung Eigenschaft mit einer Teilansicht Bindung
- 18. Wpf - Problem mit der Bindung an eine Sammlung Artikel
- 19. Ausführen, wenn eine Anwendung zerstört/nicht implementiert
- 20. Die Update-Anweisung funktioniert nicht
- 21. SonarLint nicht sieht Server-Bindung
- 22. Meteor Update-Sammlung mit Objekt
- 23. Benutzerdefinierte Gruppenfeld Bindung nicht
- 24. Bindung bindet nicht?
- 25. Backbone-Sammlung fetch (add: true) aktualisiert die Sammlung nicht
- 26. Jquery/JavaScript-Code Bindung an Sammlung
- 27. Komponente Bindung funktioniert nicht
- 28. WPF Bindung funktioniert nicht
- 29. Bindung an nicht
- 30. AngularJS Array Bindung nicht