C# 超级简单的MVVM轻型WP7示例?

C# 超级简单的MVVM轻型WP7示例?,c#,silverlight,windows-phone-7,mvvm-light,C#,Silverlight,Windows Phone 7,Mvvm Light,我正在寻找一个以最轻松的方式展示以下内容的示例: 调用基于SOAP的web服务的模型;定期轮询以获取最新值(假设SOAP服务返回布尔值)。该模型还应该支持调用SOAP方法来更改服务器上的布尔值 一种ViewModel,使基础布尔值能够绑定到视图中的控件(例如,绑定到复选框) 将上述复选框控件绑定到基础布尔值的视图。根据轮询间隔,复选框将随着服务器状态的更改而更新。如果选中该复选框,事件将被发送到模型,从而导致服务器更新 这个示例最好能在WindowsPhone7上运行,但在紧要关头,我很乐意使用

我正在寻找一个以最轻松的方式展示以下内容的示例:

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

一种ViewModel,使基础布尔值能够绑定到视图中的控件(例如,绑定到复选框)

将上述复选框控件绑定到基础布尔值的视图。根据轮询间隔,复选框将随着服务器状态的更改而更新。如果选中该复选框,事件将被发送到模型,从而导致服务器更新

这个示例最好能在WindowsPhone7上运行,但在紧要关头,我很乐意使用支持SL3的东西(不允许使用SL4命令路由)


我正在努力理解如何让MVVM Light为我工作,我怀疑一位专家可以很快编写出这样的示例。。。我还怀疑这是许多应用程序中相当常见的模式

Mick N的指针帮助了我,但真正让我渡过难关的是Jeremy Likness的这篇帖子:

以下是为他人着想的示例(假设我没有做任何真正愚蠢的事情):

首先,我开始使用Mvvm Light Windows Phone 7项目

我在MainPage.xaml中添加了一个复选框:

MainViewModel.cs已修改为包含以下内容


私有OnOffSwitchClass_Switch1=新的OnOffSwitchClass()

我添加了对DispatcherHelper.Initialize()的调用;在我的App()构造函数中


这看起来正确吗?

从移动设备轮询服务器充其量只是一种代码味道,但通常是一种反模式,因为它会影响资源使用。您应该考虑让服务器进程在服务返回的值更改时发送通知。如果你能展示你的尝试和遇到的问题,你也可能得到更多的帮助。请某人写一个工作示例很少是获得帮助的成功策略。请查看Joost van Schaik最近在wp7论坛上发布的这篇博文(kP from memory?)。我怀疑你会发现一个“样本”碰巧也实现了你的“需求”,但至少有一个样本符合你的问题标题所描述的,你可以学习,然后将你更详细的需求应用到其中。关于编写一个对某人有特定需求的应用程序的公平评论,但是,如果有一个样本可以证明至少一个可以联系起来的主要基础,那么这就是一个开始,Joost的例子对我也非常有帮助。这并不像我希望的那个样简单,但它确实暴露了一些关键模式。谢谢。至于模型问题,在WP7中,我使用一个模型类来读/写瞬态内存和隔离存储。ViewModels用于显示视图/页面绑定到的数据。如果您像使用视图模型一样使用模型,那么它可能应该是视图模型在App.xaml.cs的Appliance_Launching和Appliance_Activated方法中。谢谢Matt-为什么在_Launching和_Activated中而不是在构造函数中?因为否则当应用程序从逻辑删除返回时,它可能不会重新初始化
    <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" />
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));
        }
    }
}
public OnOffSwitchClass Switch1 
{
    get
    {
        return _Switch1;
    }
}