4 Stimmen

Wie WPF-Listenfeld zu löschen?

Hai bin mit WPF-Listenfeld, ich kann nicht in der Lage, die Liste zu löschen, wenn ich die Funktion reload data aufrufe, ich möchte nur neue Daten zur Laufzeit neu laden, während Seite laden es lädt die Daten richtig, wenn ich aktualisieren die neuen Daten in itemsource geholt wird, kann ich sehen, dass im Debug-Modus, aber keine neuen Daten in Listbox, alte Daten bleibt in der Liste, ich kann nicht einmal klar, wenn ich list.items.clear() aufrufen, es wirft Ausnahme und app stürzt ab, ich versuchte viel Möglichkeiten, ist ther jedes Problem in meinem XAML-Bindung, die folgenden ist mein Code.

<DataTemplate x:Key="listBoxTemplate">
                <StackPanel Margin="3">
                    <DockPanel >
                        <TextBlock FontWeight="Bold" Text="{Binding Name}" DockPanel.Dock="Left" Margin="5,0,10,0"/>
                        <TextBlock Text="  " />
                         <TextBlock Text="{Binding Percnt}" Foreground="Green" FontWeight="Bold" />
                   </DockPanel>                       
                </StackPanel>
            </DataTemplate>

Meine Listbox

 <ListBox Height="898" Name="lstEntity" Width="291" ItemTemplate="{StaticResource listBoxTemplate}" SelectionChanged="lstEntity_SelectionChanged"/>

Verbindlicher Code

   lstEntity.ItemsSource = sei.getNames();

getNames() Funktion gibt nur die Daten als Liste, nichts Besonderes Code in, dass, wie dies zu beheben.

0 Stimmen

Was sind die Ausnahmen, die Sie erhalten, wenn Sie versuchen, das Listenfeld zu löschen und seine ItemsSource auf null setzen? Verwenden Sie andere Threads?

4voto

Mark Punkte 14552

Der beste Weg, um diese Art von Verhalten zu erhalten, ist die Verwendung einer DependencyProperty und Bindungen.

In Ihrer Klassendatei erstellen Sie die DP wie folgt:

    #region MyList dependency property
    public static readonly DependencyProperty MyListProperty = DependencyProperty.Register("MyList", typeof(ObservableCollection<String>), typeof(Window1));

    public ObservableCollection<String> MyList
    {
        get { return (ObservableCollection<String>) GetValue(MyListProperty); }
        set { SetValue(MyListProperty, value); }
    }
    #endregion

Dann binden Sie in Ihrer XAML an diesen DP wie folgt:

<ListBox ItemSource={Binding Path=MyList, ElementName=MyWindow} Height="898" Name="lstEntity" Width="291" ItemTemplate="{StaticResource listBoxTemplate}" SelectionChanged="lstEntity_SelectionChanged"/>

Wobei "MyWindow" der x:Name des Root-Fensters in Ihrer XAML-Datei ist (Sie könnten natürlich auch Datacontext wie das MVVM-Muster verwenden :)

Wenn Sie dann Elemente aus Ihrem Code hinzufügen/entfernen möchten, greifen Sie einfach direkt auf die Liste zu:

MyList.Clear();
MyList.Add("My New String");

Sie müssen natürlich auch den generischen Typ der Sammlung in Ihre eigene Klasse ändern...

1voto

Jeff Mercado Punkte 120818

Füllen Sie (jemals) die ListBox durch direktes Hinzufügen zu der Items-Auflistung oder nur durch ItemsSource?

Wenn letzteres der Fall ist, setzen Sie die ItemsSource auf null und setzen Sie sie zurück auf reload.

1 Stimmen

Wenn ich NULL setze, wird auch die Meldung "Operation is not valid while ItemsSource is in use. Greifen Sie stattdessen auf Elemente mit ItemsControl.ItemsSource zu und ändern Sie sie." Es funktioniert auch nicht. ????

0 Stimmen

Ich füge nicht direkt hinzu, sondern nur über die Elementquelle

0 Stimmen

Es geht darum, die Eigenschaft zu aktualisieren, an die Sie ursprünglich gebunden waren. Aktualisieren Sie das Objekt im Speicher und das sollte die Benutzeroberfläche aktualisieren. Wenn Sie also eine ObservableCollection als ItemSource verwenden, sollte das Zuweisen der Collection-Eigenschaft an einen neuen Wert die UI-Komponente löschen, der Aufruf von add/remove sollte sie aktualisieren usw. Sie sollten nicht direkt auf die Liste der Elemente zugreifen, um Änderungen an der Sammlung vorzunehmen; dies würde eine Ausnahme auslösen. Die andere Möglichkeit ist, INotifyPropertyChanged selbst zu implementieren.

1voto

Amsakanna Punkte 11241

Ich kann nicht sagen, was die Ursache des Problems in Ihrem Fall ist, bis Sie die Ausnahme und andere Details angeben. Ich schlage jedoch vor, die Sache besser zu machen.

  1. Lassen Sie Ihr getnames Methode ein IEnumerable zurück.
  2. Konstruieren Sie eine ObservableCollection aus ihr.
  3. Setzen Sie die ItemsSource auf die erstellte ObservableCollection

Jetzt können Sie Ihre ObservableCollection ändern, um die Änderungen in der ListBox zu sehen.

1voto

Malcolm Punkte 1791

Bevor Sie dies tun:

  lstEntity.ItemsSource = sei.getNames();

Löschen Sie die Elemente der Listbox source :

lstEntity.ItemsSource = "";

0 Stimmen

Das wird genau die gleiche Ausnahme auslösen, als wenn er sie auf null setzen würde.

0voto

Rob Perkins Punkte 3010

Wenn Sie das MVVM-Muster verwenden, fügen Sie eine Eigenschaft zu Ihrem ViewModel hinzu:

public IEnumerable Names {
    get { return sei.getNames() as IEnumerable; }
}

Dann codieren Sie ItemsSource in Ihrer XAML wie folgt:

<ListBox ... ItemsSource="{Binding Names}" ... />

Wann immer sich der Inhalt Ihrer Namensliste ändert, lösen Sie das PropertyChanged-Ereignis aus; dadurch wird das WPF-System angewiesen, Ihre ListBox zu aktualisieren:

PropertyChanged(this, new PropertyChangedEventArgs("Names");

0 Stimmen

Ich verwende kein MVVM-Muster. nur normale Bindung

0 Stimmen

Dann implementieren Sie diese Eigenschaft und die Schnittstelle INotifyPropertyChanged direkt in Ihrer Klasse, wenn Sie können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X