Супер-простой образец MVVM-Light WP7? - PullRequest
11 голосов
/ 07 сентября 2010

Я ищу образец, который как можно проще демонстрирует следующее:

Модель, которая вызывает веб-сервис на основе SOAP; регулярно опрашивать, чтобы получить последнее значение (предположим, что служба SOAP возвращает логическое значение). Модель также должна поддерживать вызов метода SOAP, который изменяет логическое значение на сервере.

Модель представления, позволяющая привязать базовый логический элемент к элементам управления в представлении (например, к флажку).

Представление с вышеуказанным флажком, привязанным к базовому логическому значению. В зависимости от интервала опроса флажок будет обновляться по мере изменения состояния сервера. Если флажок установлен, событие будет отправлено в модель, что приведет к обновлению сервера.

Оптимально, этот пример будет работать на Windows Phone 7, но в крайнем случае я был бы рад тому, что поддерживает SL3 (использование маршрутизации команд SL4 запрещено).

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

Ответы [ 2 ]

8 голосов
/ 08 сентября 2010

Указатель Мика Н помог, но то, что действительно заставило меня преодолеть горб, это пост Джереми Ликнесса: http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html

Вот пример для других (при условии, что я не делаю ничего действительно глупого):

Сначала я начал использовать проект Mvvm-Light для Windows Phone 7.

Я добавил флажок в свой MainPage.xaml: </p> <pre><code> <CheckBox Content="Switch 1" IsChecked="{Binding Switch1.PowerState, Mode=TwoWay}" Height="72" HorizontalAlignment="Left" Margin="24,233,0,0" Name="checkBox1" VerticalAlignment="Top" Width="428" />

Обратите внимание, что IsChecked привязан к Switch1.PowerState в режиме TwoWay, поэтому свойство передается в обоих направлениях.

Ключевым моментом для меня является то, как включить связь с моим обратным вызовом таймера (TimerCB), который будет работать в новом потоке в потоке пользовательского интерфейса Silverlight. Я использовал помощник Mvvm-Light DispatcherHelper.CheckBeginInvokeOnUI, который ожидает в потоке пользовательского интерфейса.

Затем мне нужно было решить, реализовать ли сам INotifyPropertyChanged в моей модели или использовать реализацию ViewModelBase Mvvm-Light. Я на самом деле пробовал оба способа, и он работал, но решил, что мне больше нравится использовать ViewModelBase, потому что он поддерживает «трансляцию», и я думаю, что в моем реальном проекте это будет удобно, потому что у меня будет несколько ViewModels. Кажется немного неуместным основывать «Model» на классе ViewModelBase, но я не думаю, что в этом есть какой-то вред. (???).

Моя модель .cs ниже.
</p> <pre><code>public class OnOffSwitchClass : ViewModelBase // ignore that it's derived from ViewModelBase! { private const Int32 TIMER_INTERVAL = 5000; // 5 seconds private Timer _timer; // Upon creation create a timer that changes the value every 5 seconds public OnOffSwitchClass() { _timer = new System.Threading.Timer(TimerCB, this, TIMER_INTERVAL, TIMER_INTERVAL); } private static void TimerCB(object state) { // Alternate between on and off ((OnOffSwitchClass)state).PowerState = !((OnOffSwitchClass)state).PowerState; } public const string PowerStatePropertyName = "PowerState"; private bool _myProperty = false; public bool PowerState { get { return _myProperty; } set { if (_myProperty == value) { return; } var oldValue = _myProperty; _myProperty = value; // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() => RaisePropertyChanged(PowerStatePropertyName, oldValue, value, true)); } } }

Файл MainViewModel.cs был изменен для включения следующего

private OnOffSwitchClass _Switch1 = new OnOffSwitchClass();</p> <pre><code>public OnOffSwitchClass Switch1 { get { return _Switch1; } }

И я добавил вызов DispatcherHelper.Initialize (); в конструкторе моего приложения ().

Это выглядит правильно?

3 голосов
/ 07 сентября 2010

Проверьте это сообщение в блоге Джуста ван Шейка, которое недавно было связано (по kP из памяти?) На форумах wp7.

http://dotnetbyexample.blogspot.com/2010/07/using-mvvm-light-to-drive-windows-phone.html

Я сомневаюсь, что вы найдете «образец», который также реализует ваши «требования», но, по крайней мере, с образцом, который соответствует названию вашего вопроса, вы можете узнать, а затем применить к нему более подробные требования.

...