2009-08-10 4 views
6

Пожалуйста, не судите строго, если этот вопрос обсуждался ранее или косвенно отвечал в огромных соседних призмах и блоках mvvm. В реализации WPF классов RelayCommand или DelegateCommand есть такая EventHandlerMVVM (ICommand) в 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; } 
} 

, но в SL поднабора пространств имен не существует никакого класса CommandManager. И здесь я застрял. Я еще не нашел обходного пути для этого в MVVM-приемке для SL (PRISM для меня так сложна). Различные простые приложения HelloWorldMVVM вообще не имеют отношения.

Заранее спасибо и извините за мой английский -)

ответ

5

Там нет поддержки команд в Silverlight. Когда пользователь манипулирует элементами управления в своем представлении, вам придется писать код (например, обработчики событий), который изменяет модель представления в коде для вашего представления. Это может быть так просто, как вызов метода на модели представления, когда пользователь нажимает кнопку в представлении. Используя PRISM, вы можете создавать прикрепленные свойства в XAML для вашего вида, чтобы избавиться от этих обработчиков событий, но если вы предпочитаете не использовать PRISM, вы можете просто придерживаться использования обработчиков событий.

Еще один аспект, который вам придется обработать, - это изменение вида при изменении модели представления. В частности, вы захотите включить и отключить элементы управления на основе состояния модели представления. Чтобы достичь этого, вам необходимо связать свойство IsEnabled элемента управления с чем-то в модели представления, которая отражает, разрешена ли определенная операция. Реализация пользовательских объектов IValueConverter, которые преобразуются в логические значения, часто являются полезными. Например, если ваша модель представления имеет свойство, которое представляет собой счетчик, и вы хотите, чтобы конкретный элемент управления в представлении включался только тогда, когда счетчик больше нуля, вы можете создать преобразователь значений, который преобразуется в true, когда число больше чем нуль, и использовать этот конвертер значений в привязке.

Если вы попытаетесь адаптировать WPF-пример приложения MVVM, вам придется избавиться от всех видов использования команд и заменить свой собственный код. Код в вашем примере не имеет смысла в Silverligt, но в WPF он участвует в процессе определения того, включен ли элемент управления в представлении, видимый и т. Д.

+0

Я думаю, что вы немного ошибаетесь - есть поддержка ICommand (может быть ограничена, но существует и класс ICommand существует) в Silverlight 2 –

+1

Это правда, что интерфейс 'ICommand' определен в Silverlight, но он нигде не используется, и вся командная инфраструктура в WPF, которая так хорошо работает с шаблоном MVVM, отсутствует в Silverlight. –

+0

Спасибо. Я думал, что присутствие ICommand означает полную командующую поддержку, поэтому я ошибался - (Таким образом, оказывается, что реализация MVVM в SL не так проста, как в WPF. Я нашел только один способ - используя прилагаемые правильные и поведенческие правила, как это: http://blogs.southworks.net/jdominguez/2008/08/icommand-for-silverlight-with-attached-behaviors/ или с использованием готового фреймворка, где многие события охвачены http: // nroute. codeplex.com –

5

Silverlight 4.0 поддерживает интерфейс ICommand и, таким образом, предоставит WPF как командная инфраструктура.