2012-12-26 10 views
6

So die Grundlagen zu löschen Aktualisierung: Ich habe ein Fenster mit einem Listview auf sie bekam, die durch mein Raster Datacontext bevölkert ist:Listview mit Datatable Bindung, nicht nach Zeile

mainGrid.SetBinding(Grid.DataContextProperty, 
    new Binding() { 
     Source = new DataView() 
      { Table = SQLHandler.GetHandler[classType.ToString()] } 
    } 
); 

in XAML:

<ListView Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" ItemsSource="{Binding}"> 

alles funktioniert gut, es ist bevölkert. Wie Sie oben sehen können, habe ich eine SQLHandler-Klasse, auf die von Singleton zugegriffen werden kann, und ich kann mit einem Indexer auf meine Tabellen zugreifen.

Das Problem: Fenster lädt, ich wähle eine Zeile, klicken Sie auf die Schaltfläche Bearbeiten, neues Fenster wird geladen, wo ich die Details der ausgewählten Zeile erhalten. Wenn ich diese Zeile über dieses neue Fenster lösche und schließe, wird das Hauptfenster (wo die komplette Datentabelle angezeigt wird) nicht entsprechend aktualisiert. Ich weiß, was die Lösung sein sollte, aber ich kann es nicht funktionieren lassen. (Inotifyproperty geändert Schnittstelle zu SqlHandler Klasse, Binding.IndexerName etc ..)

hier ist die Hauptsache: der Datensatz ist nicht in meiner SqlHandler Klasse, es ist in SqlExecuter, wo alle meine SqlCommands ausgeführt werden.

public override DataTable this[string key] 
{ 
    get 
    { 
     if (sqlExecuter.GetDataSet.Tables.Contains(key)) 
      return sqlExecuter.GetDataSet.Tables[key]; 
     throw new KeyNotFoundException("The specified key was not found"); 
    } 
} 

wo GetDataSet ist:

public DataSet GetDataSet 
{ 
    get { return ds; } 
} 

Wie kann ich diese Arbeit machen? Wenn ich eine Zeile in einem anderen Fenster lösche und diese schließe, wird die Listenansicht des Hauptfensters nicht aktualisiert. Die einzige Option, die ich habe, ist eine Aktualisierungsschaltfläche zu setzen und die Eigenschaft datacontext erneut zu binden, dann funktioniert es natürlich, aber mein Ziel ist ein "Live" -Update-System, darum geht es schließlich.

Was ich versucht habe: GetDataSet in SqlExecuter: implementiert die Schnittstelle inotifypropertychanged, aber nichts geändert. und ich kann inotifypropertychange nicht auf meinem Indexer in SqlHandler implementiert haben, da es keinen Setter hat, ich immer nur auf die Tabellen von Code-behind zugreifen, mein sqldataAdapter füllt sie (Fill-Methode)

ps : Ich plane nicht wirklich eine ObservableCollection zu erstellen, weil 90% meines Codes neu geschrieben werden sollten und wenn ich eine Zeile lösche, lösche ich meinen Datensatz und fülle ihn wieder auf, so dass ich nicht einmal erwarte, dass er jede Änderung bemerkt nur, wenn ich meine Datentabelle aufzufüllen, sollte meine Listview darüber wissen .. und erfrischen sich

Antwort

0

Sie müssen möglicherweise die Bindungsmodus auf zwei Art und Weise einzustellen:

Mode = BindingMode.TwoWay 

WPF aus einigen nicht offensichtlichen Gründen, Standardeinstellung ist die Einwegbindung. Ich hoffe, das hilft. Ich bin nicht besonders gut informiert, aber ich habe dieses Problem mit einfachen Datenbindungen zu ObservableCollections gesehen, und die TwoWay-Bindung behebt es.

1

Ich denke, mit einem zweiten Fenster als Popup könnte hier das Problem sein. Wenn Sie die Bearbeitung auf der gleichen Seite tun, dann könnte man einen einfachen verwenden

ListView1.DataBind() 

Um den Inhalt der Liste am Ende des Löschbefehls zu aktualisieren. Oder Sie können die IsPostBack-Methode verwenden, um die Liste zu aktualisieren, wenn die Seite neu gezeichnet und nicht neu geladen wurde.

Sie könnten versuchen, den Seitennamen und dann die Listenansicht von Ihrem anderen Fenster aufrufen, aber ich bin mir nicht sicher, ob Sie diese Art von Befehl aus einem anderen Fenster ausführen können.

Alternativ können Sie die Bearbeitung auch auf einer anderen Seite als einem separaten Fenster vornehmen. Wenn Sie also zur ursprünglichen Seite zurückkehren, wird die Listenansicht neu gezeichnet.

Wie Sie bin ich sicher, es gibt eine einfachere Lösung für Ihr Problem, aber leider weiß ich es nicht.

Verwandte Themen