Простой образец MVVM-Light WP7?

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

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

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

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

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

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

Ответ 1

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

Здесь образец для других (предполагая, что я не делаю ничего глупого):

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

Я добавил флажок в свой 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 в моей модели или использовать реализацию Mvvm-Light ViewModelBase. Я действительно пробовал это в обоих направлениях и работал, но решил, что мне нравится использовать ViewModelBase лучше, потому что он поддерживает "трансляцию", и я думаю, что в моем фактическом проекте это будет удобно, потому что у меня будет несколько ViewModels. Кажется, немного неодобрительно основывать "Модель" на классе ViewModelBase, но я не думаю, что там есть какой-либо вред. (???).

Моя модель .cs находится ниже.

public class OnOffSwitchClass : ViewModelBase // ignore that it 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().

Правильно ли это выглядит?

Ответ 2

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

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

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