Супер-простой образец MVVM-Light WP7?

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

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

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

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

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

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


person tig    schedule 07.09.2010    source источник
comment
Опрос сервера с мобильного устройства - это в лучшем случае запах кода, но обычно это анти-шаблон, поскольку он имеет последствия для использования ресурсов. Вам следует обратить внимание на то, чтобы серверный процесс отправлял уведомление при изменении значения, возвращаемого службой. Вы также, вероятно, получите дополнительную помощь, если сможете продемонстрировать, что вы пробовали, и с какими проблемами столкнулись. Попросить кого-нибудь написать рабочий пример редко бывает успешной стратегией для получения помощи.   -  person Matt Lacey    schedule 07.09.2010
comment
Проверьте это сообщение в блоге Йоста ван Шайка, на которое недавно была сделана ссылка (kP по памяти?) На форумах wp7. dotnetbyexample.blogspot.com/2010/ 07 / Я сомневаюсь, что вы найдете образец, который также соответствует вашим требованиям, но, по крайней мере, с образцом, который выполняет то, что описывает заголовок вашего вопроса, вы можете изучить, а затем применить к нему более подробные требования.   -  person Mick N    schedule 07.09.2010
comment
Справедливый комментарий о написании приложения с особыми требованиями для кого-то, но если доступен образец, демонстрирующий хотя бы один из основных принципов, которые можно связать, тогда это начало для развития.   -  person Mick N    schedule 07.09.2010
comment
Пример Йуста мне тоже очень помог. Это было не так просто, как я ожидал, но раскрыло несколько ключевых паттернов. Спасибо.   -  person tig    schedule 09.09.2010


Ответы (1)


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

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

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

I added a checkbox to my MainPage.xaml:

    <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. Кажется немного грубым основывать «Модель» на классе ViewModelBase, но я не думаю, что в этом есть какой-то вред. (???).

My model .cs is below.

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();

public OnOffSwitchClass Switch1 
{
    get
    {
        return _Switch1;
    }
}

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

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

person tig    schedule 08.09.2010
comment
Что касается вопроса о модели, в WP7 я использую класс модели для чтения / записи в переходную память и изолированное хранилище. ViewModels предназначены для представления данных, которые будут привязаны к представлениям / страницам. Если вы используете свою модель как модель представления, возможно, это должна быть модель представления. - person Matt Casto; 08.09.2010
comment
Я предпочитаю вызывать DispatcherHelper.Initialize () в методах App.xaml.cs Appliance_Launching и Appliance_Activated. - person Matt Casto; 08.09.2010
comment
Спасибо, Мэтт - почему в _Launching & _Activated, а не в конструкторе? - person tig; 08.09.2010
comment
потому что в противном случае он не может быть повторно инициализирован, когда приложение возвращается из режима захоронения - person ; 26.09.2010