2009-08-10 19 views
6

Proszę, nie oceniajcie ściśle, czy to pytanie zostało wcześniej omówione lub pośrednio odpowiedział na ogromnych pobliskich blogach pryzmowych i mvvm. W realizacji WPF klas RelayCommand lub DelegateCommand jest takie PodprogramMVVM (ICommand) w Silverlight

/// <summary> 
/// Occurs whenever the state of the application changes such that the result 
/// of a call to <see cref="CanExecute"/> may return a different value. 
/// </summary> 
public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

ale w SL podzbioru przestrzeni nazw nie ma klasy poleceń CommandManager. I tutaj utknąłem. Jeszcze nie znalazłem obejścia tego problemu w przyjęciu MVVM dla SL (PRISM jest jeszcze tak skomplikowany jak dla mnie). Różne proste aplikacje HelloWorldMVVM w ogóle nie działają.

Z góry dziękuję i przepraszam za mój angielski -)

Odpowiedz

5

Nie ma wsparcia dla poleceń w Silverlight. Kiedy użytkownik manipuluje elementami sterującymi w twoim widoku, będziesz musiał napisać kod (na przykład procedury obsługi zdarzeń), który zmodyfikuje model widoku w kodzie opóźnionym dla twojego widoku. Może to być tak proste, jak wywołanie metody w modelu widoku, gdy użytkownik kliknie przycisk w widoku. Używając PRISM, jesteś w stanie stworzyć załączone właściwości w XAML dla twojego widoku, aby pozbyć się tych procedur obsługi zdarzeń, ale jeśli wolisz nie używać PRISM, możesz po prostu trzymać się za pomocą procedur obsługi zdarzeń.

Jeszcze jeden aspekt, który trzeba będzie obsłużyć, to modyfikowanie widoku po zmianie modelu widoku. W szczególności będziesz chciał włączyć i wyłączyć kontrolki w oparciu o stan modelu widoku. Aby to osiągnąć, musisz powiązać właściwość IsEnabled kontrolki z czymś w modelu widoku, który odzwierciedla, czy dana operacja jest dozwolona. Często przydaje się implementacja niestandardowych obiektów IValueConverter przekształcających się w wartości logiczne. Na przykład, jeśli twój model widoku ma właściwość reprezentującą liczbę i chcesz, aby określona kontrolka w widoku była włączona tylko wtedy, gdy liczba jest większa od zera, możesz utworzyć konwerter wartości, który konwertuje się na true, gdy liczba jest większa niż zero i użyj tego konwertera wartości w powiązaniu.

Jeśli spróbujesz dostosować przykład WPF aplikacji MVVM, będziesz musiał pozbyć się wszystkich zastosowań poleceń i zastąpić własny kod. Kod w twoim przykładzie nie ma znaczenia w Silverligt, ale w WPF jest zaangażowany w proces określania, czy kontrola w widoku jest włączona, widoczna itd.

+0

Myślę, że jesteś trochę w błędzie - istnieje obsługa ICommand (może być ograniczona, ale istnieje i istnieje klasa ICommand) w Silverlight 2 –

+1

To prawda, że ​​interfejs 'ICommand' jest zdefiniowany w Silverlight, ale nie jest on używany nigdzie, a cała infrastruktura zarządzająca w WPF, która działa tak dobrze z wzorcem MVVM, jest nieobecna w Silverlight. –

+0

Dzięki. Myślałem, że obecność ICommand oznacza pełne wsparcie, więc myliłem się - (Więc okazuje się, że implementacja MVVM w SL nie jest tak łatwa, jak w WPF.) Znalazłem tylko jeden sposób - używając przypisanych właściwości i zachowania jak to: http://blogs.southworks.net/jdominguez/2008/08/icommand-for-silverlight-with-attached-behaviors/ lub za pomocą gotowych frameworków, gdzie wiele wydarzeń obejmuje http: // nroute. codeplex.com –

5

Silverlight 4.0 obsługuje interfejs ICommand, a tym samym zapewnia WPF jak infrastruktura dowodzenia.

Powiązane problemy