2009-05-11 2 views

Antwort

1

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> 

1

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.

0

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(); 
} 
0

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