我正在寻找一个示例,它以最简单的方式演示以下内容:
调用基于 SOAP 的网络服务的模型;定期轮询以获取最新值(假设 SOAP 服务返回一个 bool 值)。该模型还应该支持调用 SOAP 方法来更改服务器上的 bool 值。
一个 ViewModel,它使底层 bool 值能够绑定(bind)到 View 中的控件(例如复选框)。
上面的复选框控件绑定(bind)到底层 bool 值的 View 。根据轮询间隔,复选框将随着服务器状态的变化而更新。如果单击该复选框,事件将被分派(dispatch)到导致服务器更新的模型。
最佳情况下,此示例将在 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 中添加了一个复选框:
请注意,IsChecked 使用 TwoWay 模式绑定(bind)到 Switch1.PowerState,以便属性双向流动。
对我来说,一个关键的学习是如何启用从将在新线程上运行的计时器回调 (TimerCB) 到 Silverlight UI 线程的通信。我使用了在 UI 线程上等待的 Mvvm-Light DispatcherHelper.CheckBeginInvokeOnUI 助手。
然后我必须决定是在我的模型中自己实现 INotifyPropertyChanged,还是使用 Mvvm-Light 的 ViewModelBase 实现。实际上,我尝试了两种方法并让它工作,但决定我更喜欢使用 ViewModelBase,因为它支持“广播”,我认为在我的实际项目中这会很方便,因为我将有多个 ViewModel。将“模型”基于 ViewModelBase 类似乎有点粗鲁,但我认为这样做没有任何害处。 (???)。
我的模型.cs如下。
public class OnOffSwitchClass : ViewModelBase//忽略它是从 ViewModelBase 派生的!
{
私有(private)常量 Int32 TIMER_INTERVAL = 5000;//5秒
私有(private)计时器_timer;
//创建时创建一个每 5 秒更改一次值的计时器
公共(public) OnOffSwitchClass()
{
_timer = new System.Threading.Timer(TimerCB, this, TIMER_INTERVAL, TIMER_INTERVAL);
}
private static void TimerCB(对象状态)
{
//在开和关之间交替
((OnOffSwitchClass)state).PowerState = !((OnOffSwitchClass)state).PowerState;
}
public const string PowerStatePropertyName = "PowerState";
私有(private) bool _myProperty = 假;
公共(public) bool PowerState
{
得到
{
返回 _myProperty;
}
放
{
如果(_myProperty == 值)
{
返回;
}
var oldValue = _myProperty;
_myProperty = 值;
//使用 GalaSoft.MvvmLight.Messenging 更新绑定(bind)和广播更改
GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() =>
RaisePropertyChanged(PowerStatePropertyName, oldValue, value, true));
}
}
}
MainViewModel.cs 已修改为包含以下内容
private OnOffSwitchClass _Switch1 = new OnOffSwitchClass();
public OnOffSwitchClass 开关 1
{
得到
{
返回 _Switch1;
}
}
然后我添加了对 DispatcherHelper.Initialize() 的调用;在我的 App() 构造函数中。
这样看起来对吗?
关于c# - 一个 super 简单的 MVVM-Light WP7 示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655422/