簡體   English   中英

一個超級簡單的MVVM-Light WP7樣本?

[英]A super-simple MVVM-Light WP7 sample?

我正在尋找一個樣本,以最輕微的方式演示以下內容:

一個調用基於SOAP的Web服務的模型; 定期輪詢以獲取最新值(假設SOAP服務返回一個布爾值)。 該模型還應支持調用更改服務器上的布爾值的SOAP方法。

一個ViewModel,它允許底層布爾值綁定到View中的控件(例如,復選框)。

具有上述復選框控件的視圖綁定到基礎布爾值。 根據輪詢間隔,復選框將隨服務器狀態的變化而更新。 如果單擊該復選框,則會將事件分派給模型,從而導致服務器更新。

最好這個樣本可以在Windows Phone 7上運行,但是在緊要關頭我會對支持SL3的東西感到滿意(不允許使用SL4命令路由)。

我正在努力學習如何讓MVVM-Light為我工作,我懷疑專家可以很快地對這樣的代碼進行編碼...我也懷疑這是很多應用程序的相當常見的模式。

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

請注意,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已修改為包含以下內容

private OnOffSwitchClass _Switch1 = new OnOffSwitchClass();

 public OnOffSwitchClass Switch1 { get { return _Switch1; } } 

我添加了對DispatcherHelper.Initialize()的調用; 在我的App()構造函數中。

這看起來不錯嗎?

查看最近由wp7論壇鏈接的Joost van Schaik發布的這篇博文(來自內存中的kP?)。

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

我懷疑你會找到一個“樣本”,它也恰好實現了你的“要求”,但至少有一個樣本可以做你的問題標題所描述的,你可以學習,然后將更詳細的要求應用到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM