Указатель Мика Н помог, но то, что действительно заставило меня преодолеть горб, это пост Джереми Ликнесса:
http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html
Вот пример для других (при условии, что я не делаю ничего действительно глупого):
Сначала я начал использовать проект Mvvm-Light для Windows Phone 7.
Я добавил флажок в свой MainPage.xaml:
</p>
<pre><code> <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 в режиме TwoWay, поэтому свойство передается в обоих направлениях.
Ключевым моментом для меня является то, как включить связь с моим обратным вызовом таймера (TimerCB), который будет работать в новом потоке в потоке пользовательского интерфейса Silverlight. Я использовал помощник Mvvm-Light DispatcherHelper.CheckBeginInvokeOnUI, который ожидает в потоке пользовательского интерфейса.
Затем мне нужно было решить, реализовать ли сам INotifyPropertyChanged в моей модели или использовать реализацию ViewModelBase Mvvm-Light. Я на самом деле пробовал оба способа, и он работал, но решил, что мне больше нравится использовать ViewModelBase, потому что он поддерживает «трансляцию», и я думаю, что в моем реальном проекте это будет удобно, потому что у меня будет несколько ViewModels. Кажется немного неуместным основывать «Model» на классе ViewModelBase, но я не думаю, что в этом есть какой-то вред. (???).
Моя модель .cs ниже.
</p>
<pre><code>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();</p>
<pre><code>public OnOffSwitchClass Switch1
{
get
{
return _Switch1;
}
}
И я добавил вызов DispatcherHelper.Initialize (); в конструкторе моего приложения ().
Это выглядит правильно?