一个超级简单的MVVM-Light WP7样本?

时间:2010-09-07 02:48:24

标签: c# silverlight windows-phone-7 mvvm-light

我正在寻找以最轻微的方式展示以下内容的样本:

调用基于SOAP的Web服务的模型;定期轮询以获取最新值(假设SOAP服务返回一个布尔值)。该模型还应支持调用更改服务器上布尔值的SOAP方法。

一个ViewModel,它允许将基础布尔值绑定到视图中的控件(例如,复选框)。

具有上述复选框控件的视图绑定到基础布尔值。根据轮询间隔,复选框将随服务器状态的变化而更新。如果单击该复选框,则会将事件分派给模型,从而导致服务器更新。

最好这个示例适用于Windows Phone 7,但是在紧要关头我会对支持SL3的内容感到满意(不允许使用SL4命令路由)。

我正在努力尝试理解如何让MVVM-Light为我工作,我怀疑专家可以很快地对这样的样本进行编码......我也怀疑这是一个很常见的模式应用。

2 个答案:

答案 0 :(得分:8)

Mick N的指针有所帮助,但真正让我超越驼峰的是Jeremy Likness的这篇文章: 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" />

<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使用TwoWay模式绑定到Switch1.PowerState,以便属性双向流动。

对我来说,一个关键的学习是如何启用从我的计时器回调(TimerCB)进行通信,该回调将在新线程上运行到Silverlight UI线程。我使用了Mvvm-Light DispatcherHelper.CheckBeginInvokeOnUI帮助程序,它在UI线程上等待。

然后我必须决定是否在我的模型中实现INotifyPropertyChanged,或者使用Mvvm-Light的ViewModelBase实现。我实际上尝试了两种方式,并让它工作,但我决定更好地使用ViewModelBase,因为它支持“广播”,我认为在我的实际项目中,这将是方便的,因为我将有多个ViewModel。在ViewModelBase类上建立一个“模型”似乎有点粗鲁,但我不认为这样做有任何伤害。 (???)。

我的模特.cs在下面。

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已修改为包含以下内容

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

private OnOffSwitchClass _Switch1 = new OnOffSwitchClass();

我添加了对DispatcherHelper.Initialize()的调用;在我的App()构造函数中。

这看起来不错吗?

答案 1 :(得分:3)

查看最近由wp7论坛链接的Joost van Schaik发布的这篇博文(来自内存中的kP?)。

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

我怀疑你会找到一个“样本”,它也恰好实现了你的“要求”,但至少有一个样本可以做你的问题标题所描述的,你可以学习,然后将更详细的要求应用到它。 / p>