2010-12-10 9 views
7

Czy możesz wymyślić scenariusz, w którym IEditableObject będzie nadal przydatne w aplikacji WPF opartej na MVVM? Jeśli tak, czy masz przykład, który to demonstruje.IEditableObject w MVVM

Odpowiedz

14

Użyłem IEditableObject w jednej z moich aplikacji. Na przykład, jeśli masz okno dialogowe do edycji czegoś, możesz zaimplementować IEditableObject na swoim ViewModelu. Wywołujesz BeginEdit(), gdy otwiera się okno dialogowe, EndEdit(), gdy użytkownik kliknie OK, a CancelEdit(), gdy użytkownik kliknie anuluj.

IEditableObject to dobry interfejs w dowolnym momencie, gdy chcesz przywrócić zmiany.

+0

Czy implementujesz metody w każdej klasie ViewModel, czy tylko w oryginalnej klasie abstrakcji? Jeśli oryginalna klasa, jak to robisz? Myślałem o ponownym pobraniu modelu z bazy danych, ale modele nie mają wspólnej klasy nadrzędnej. Nie jestem pewien co do metody refleksji, ponieważ edytuję tylko część modelu. –

+1

To zależy. Wdrożyłbym go tylko w abstrakcyjnej klasie bazowej, jeśli modele mają wspólną funkcjonalność do uruchamiania na tych zdarzeniach. Jeśli tak, to możesz go tam zaimplementować, ale w środku wywołaj metodę abstrakcyjną, taką jak OnBeginEdit(), która musi dostarczyć klasy pochodne. W ten sposób obejmuje się zarówno wspólną, jak i specyficzną funkcjonalnością. – Botz3000

+0

Mam ViewModel, który jest zbiorem obiektów. Chcę użyć okna dialogowego do edycji wybranego elementu widoku siatki. Który implementuje 'IEditableObject', widok zawierający siatkę, ViewModel, do którego siatka jest związana, lub klasy, która ViewModel zawiera kolekcję? –

2

W typie wyświetlanym w postaci DataGrid. Było to potrzebne, ponieważ kiedy korzystam z zakładek, w tej zakładce przechowuje się DataGrid, przełączając zakładki potrzebne do wymuszenia zatwierdzenia w taki sposób, aby mówić w obrębie DataGrid, jeśli komórka była aktywna; cofnięcie zmian, ponieważ nie zostały zatwierdzone. T

W celu uzyskania tej funkcjonalności zastosowano funkcję DataGrid, ale część IEditableObject znajduje się poniżej.

private IDatabaseConnection _copy; 

void IEditableObject.BeginEdit() 
{ 
    if (this._copy == null) 
     this._copy = _container.Resolve<IDatabaseConnection>(); 

    _copy.Database = this.Database; 
    _copy.DisplayName = this.DisplayName; 
    _copy.HostName = this.HostName; 
    _copy.Username = this.Username; 
    _copy.Password = this.Password; 
} 

void IEditableObject.CancelEdit() 
{ 
    this.Database = _copy.Database; 
    this.DisplayName = _copy.DisplayName; 
    this.HostName = _copy.HostName; 
    this.Username = _copy.Username; 
    this.Password = _copy.Password; 
} 

void IEditableObject.EndEdit() 
{ 
    _copy.Database = String.Empty; 
    _copy.DisplayName = String.Empty; 
    _copy.HostName = String.Empty; 
    _copy.Username = String.Empty; 
    _copy.Password = String.Empty; 
} 
2

Mam implementację IEditableObject w mojej aplikacji tak, że mogę trzymać z aktualizacją mojego modelu danych, jeśli to, co użytkownik jest nieprawidłowy i przywrócić oryginalne wartości, jeżeli użytkownik opuści zmian.