2012-12-26 11 views
6

więc podstaw: Mam okno z ListView na nim, który jest wypełniany przez datacontext mojego Grid:ListView Binding z DataTable, nie aktualizowanie po usunięciu wiersza

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

w XAML:

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

wszystko działa poprawnie, jest wypełnione. Jak widać powyżej, mam klasę SQLHandler, do której dostęp ma Singleton, i mogę uzyskać dostęp do moich tabel za pomocą narzędzia indeksującego.

Problem: okno ładuje się, wybieram wiersz, klikam przycisk Edytuj, nowe okno ładuje się, gdzie otrzymuję szczegóły wybranego wiersza. kiedy usuwam ten wiersz przez to nowe okno i zamykam go, okno główne (gdzie pokazane jest pełne zestaw danych) nie jest odpowiednio aktualizowane. wiem, jakie powinno być rozwiązanie, ale nie mogę tego zrobić. (inotifyproperty zmienił interfejs na SqlHandler, Binding.IndexerName itp.)

o to, co najważniejsze: zbiór danych nie znajduje się w mojej klasie SqlHandler, jest w SqlExecuter, gdzie wykonywane są wszystkie moje sqlcommands.

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"); 
    } 
} 

gdzie GetDataSet jest:

public DataSet GetDataSet 
{ 
    get { return ds; } 
} 

Jak mogę dokonać tej pracy? Kiedy usuwam wiersz w innym oknie i zamykam go, lista widoków głównego okna nie aktualizuje się. Jedyną dostępną opcją jest wstawienie przycisku odświeżania, a następnie ponowne powiązanie właściwości datacontekstu, a następnie oczywiście, że działa, ale moim celem jest posiadanie "żywego" systemu aktualizacji, w końcu to jest Binding.

Co wypróbowałem: GetDataSet w SqlExecuter: zaimplementował interfejs inotifypropertyfikacji, ale nic się nie zmieniło. i nie mogę mieć inotifypropertychicznie zaimplementowane na moim indeksatorze w SqlHandler, ponieważ nie ma on ustawiacza, zawsze uzyskuję dostęp tylko do tabel z kodu źródłowego, mój sqldataadapter je zapełnia (metoda wypełniania)

ps : tak naprawdę nie planuję tworzenia ObservableCollection, ponieważ 90% mojego kodu powinno zostać przepisane, a kiedy usunę wiersz, wyczyściłem mój zestaw danych i uzupełniłem go ponownie, więc nawet nie spodziewam się, że zauważy każdą zmianę , kiedy tylko napełnić moje DataTable, mój ListView powinien wiedzieć o tym .. i odświeżyć sobie

Odpowiedz

0

Być może trzeba ustawić tryb wiązania do dwóch sposób:

Mode = BindingMode.TwoWay 

WPF z pewnych nieoczywistych powodów, domyślnie wiążący jest jeden sposób. Nadzieja, która pomaga. Nie jestem szczególnie dobrze poinformowany, ale widziałem ten problem z prostymi powiązaniami danych z ObservableCollections, a powiązanie TwoWay je naprawia.

1

Myślę, że używanie drugiego okna jako wyskakującego okienka może być problemem. Jeśli robisz edycję na tej samej stronie, a następnie można wykorzystać prosty

ListView1.DataBind() 

Aby odświeżyć zawartość listy na końcu polecenia kasowania. Lub możesz użyć metody IsPostBack do aktualizacji listy, jeśli strona została przeniesiona przerysowana, a nie ponownie załadowana.

Możesz spróbować wywołać nazwę strony, a następnie widok listy z drugiego okna, ale nie jestem pewien, czy możesz wykonać tego rodzaju polecenie z innego okna.

Alternatywnie można dokonać edycji na innej stronie, zamiast osobnego okna, więc po powrocie do pierwotnej strony lista jest przerysowywana.

Podobnie jak Ty, jestem pewien, że istnieje prostsze rozwiązanie problemu, ale niestety go nie znam.

Powiązane problemy