2010-09-07 47 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