c# - 一个 super 简单的 MVVM-Light WP7 示例?

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

我正在寻找一个示例,它以最简单的方式演示以下内容:

调用基于 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/

相关文章:

javascript - ASP.Net 从表中动态创建的行获取信息

c# - ASP.NET 中的 GridView 问题

c# - 如何在 Silverlight 中创建客户端帮助程序类?

Silverlight:动画和/或平移图像

windows-phone-7 - WP7 中是否有标签控件?

c# - "duplicate items"参数出现 "Resources"错误如何解决

c# - 如何在winform上绘制丰富格式的字符串?

windows-phone-7 - 在 Windows Phone 7 中设置闹钟

silverlight - Silverlight 中的并发连接数

c# - 将 system.windows.media.brush 转换为十六进制颜色代码