Mick Ns Zeiger geholfen, aber über den Buckel, was mich wirklich diesen Beitrag von Jeremy Likness: http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html
Hier ist die Probe für den Nutzen der anderen (vorausgesetzt, ich tue nichts wirklich dumm):
Zuerst begann ich mit dem Mvvm-Light Windows Phone 7-Projekt.
Ich habe ein Kontrollkästchen, um meine 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" />
Beachten Sie die IsChecked zu Switch1.PowerState gebunden ist, den TwoWay-Modus, so dass die Eigenschaft in beiden Richtungen fließt.
Ein Schlüssel lernen für mich ist, wie die Kommunikation von meinem Timer Callback (TimerCB), die auf einem neuen Thread auf dem Silverlight UI-Thread ausgeführt wird, zu ermöglichen. Ich habe den Helfer Mvvm-Light DispatcherHelper.CheckBeginInvokeOnUI benutzt, der auf dem UI-Thread wartet.
Ich musste dann entscheiden, ob ich in meinem Modell InotifyPropertyChanged implementieren, oder Mvvm-Light ViewModelBase Implementierung verwenden. Ich probierte es tatsächlich in beide Richtungen und hatte es funktioniert, aber ich entschied mich, ViewModelBase besser zu verwenden, weil es "broadcast" unterstützt und ich glaube, dass es in meinem aktuellen Projekt nützlich sein wird, da ich mehrere ViewModels haben werde. Es scheint ein bisschen ungehobelt zu sein, ein "Model" auf der ViewModelBase-Klasse zu gründen, aber ich denke nicht, dass es schaden könnte. (???).
Mein Modell .cs ist unten.
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));
}
}
}
Die MainViewModel.cs wurde modifiziert, um gehören die folgenden
private OnOffSwitchClass _Switch1 = new OnOffSwitchClass();
public OnOffSwitchClass Switch1
{
get
{
return _Switch1;
}
}
Und fügte ich einen Anruf zu DispatcherHelper.Initialize(); in meinem App() - Konstruktor.
Sieht das richtig aus?
Das Abrufen eines Servers von einem mobilen Gerät ist bestenfalls ein Code-Geruch, aber in der Regel ein Anti-Pattern, da es Auswirkungen auf die Ressourcennutzung hat. Sie sollten überprüfen, ob der Serverprozess eine Benachrichtigung sendet, wenn sich der vom Dienst zurückgegebene Wert ändert. Sie erhalten wahrscheinlich auch mehr Hilfe, wenn Sie demonstrieren können, was Sie versucht haben und welche Probleme aufgetreten sind. Nach jemandem zu fragen, um ein funktionierendes Beispiel zu schreiben, ist selten eine erfolgreiche Strategie, um Hilfe zu bekommen. –
Fairer Kommentar zum Schreiben einer App mit spezifischen Anforderungen für jemanden, aber wenn ein Beispiel verfügbar ist, das mindestens eine der wichtigsten Grundlagen zeigt, die verknüpft werden können, dann ist das ein Anfang, auf dem man aufbauen kann. –