2010-09-07 46 views
11

我正在寻找一个示例,以尽可能最轻的方式演示以下内容:超级简单的MVVM-Light WP7样本?

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

ViewModel使底层布尔值可以绑定到视图中的控件(例如复选框)。

一个视图与上面的复选框控件绑定到基础布尔值。根据轮询时间间隔的不同,复选框将随着服务器状态的变化而更新。如果点击该复选框,则该事件将被分派给模型,导致服务器被更新。

最佳此示例将在Windows Phone 7上工作,但在一个捏,我会很高兴支持SL3的东西(不允许使用SL4命令路由)。

我在试图理解如何让MVVM-Light为我工作而挣扎,我怀疑专家可以很快地编写一个样例......我也怀疑这是一个相当常见的模式的应用程序。

+0

从移动设备轮询服务器至多是一种代码异味,但通常是反模式,因为它具有资源使用含义。当服务返回的值发生变化时,您应该考虑让服务器进程发送通知。如果您能证明您尝试过的以及遇到的问题,您也可能获得更多帮助。要求某人编写一个工作示例很难成为获得帮助的成功策略。 – 2010-09-07 09:21:00

+0

公平评论有关为某人编写具有特定要求的应用程序的公平评论,但如果有可用样本证明至少有一个可链接的主要基础知识,那么这是一个开始构建的基础。 – 2010-09-07 10:13:25

回答

8

米克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" /> 

注意的是器isChecked使财产双向流动采用双向模式势必Switch1.PowerState。

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

然后我不得不决定是否在我的模型中自己实现INotifyPropertyChanged,或者使用Mvvm-Light的ViewModelBase实现。我实际上尝试了这两种方式,并有它的工作,但决定我更喜欢使用ViewModelBase更好,因为它支持“广播”,我认为在我的实际项目,这将是方便的,因为我会有多个ViewModels。在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包括以下

private OnOffSwitchClass _Switch1 = new OnOffSwitchClass();

public OnOffSwitchClass Switch1 
{ 
    get 
    { 
     return _Switch1; 
    } 
} 

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

这种看法合适?

+1

就模型问题而言,在WP7中,我使用模型类读取/写入瞬态存储器和隔离存储器。 ViewModels用于呈现由Views/Pages绑定的数据。如果你像使用视图模型一样使用模型,那么也许它应该是一个视图模型。 – 2010-09-08 16:14:19

+0

我更喜欢在App.xaml.cs的Appliance_Launching和Appliance_Activated方法中调用DispatcherHelper.Initialize()。 – 2010-09-08 16:16:33

+0

感谢马特 - 为什么在_Launching&_Activated而不是在构造函数? – tig 2010-09-08 17:14:04

3

请查看Joost van Schaik最近与wp7论坛联系(由内存中的kP引起)的博客文章。

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

我怀疑你会发现一个“样本”,恰巧也实现您的“要求”,但至少与做什么你的问题的标题描述你可以学习,然后申请一个样品的更对它的详细要求。

+0

Joost的例子对我也很有帮助。这并不像我所希望的那么简单,但它确实暴露了一些关键模式。谢谢。 – tig 2010-09-08 20:44:02

+0

yw :)/15char .. – 2010-09-14 13:39:54