Ich wende das MVVM-Muster an. Ich habe eine Schaltfläche, die, wenn sie angeklickt wird, einen delegierten Befehl in meinem ViewModel aufruft. Ganz am Anfang dieser Delegatenmethode setze ich einen Eigenschaftswert (WaitOn), der den Benutzer in der Benutzeroberfläche benachrichtigen soll, dass er warten soll, indem er ein animiertes Steuerelement anzeigt.
Die Bindung zur Anzeige des animierten Steuerelements wird jedoch erst dann aktualisiert, wenn der Delegat die Ausführung abgeschlossen hat, so dass die Wartezeit beendet ist. Warum geschieht dies und was sollte ich tun, um es zu umgehen?
Beispiel-XAML:
<Button Command="{Binding DoStuffCommand}" />
<ctl:MyAnimatedControl Name="ctlWait" Caption="Please Wait..."
Visibility="{Binding WaitNotification}" />
Schnipsel aus ViewModel:
public bool WaitPart1On
{
get { return _waitPart1On; }
set
{
_waitPart1On = value;
if (_waitPart1On == true)
{
WaitNotification = "Visible";
}
else
{
WaitNotification = "Hidden";
}
RaisePropertyChanged("WaitPart1On");
}
}
public string WaitNotification
{
get { return _waitNotification; }
set
{
_waitNotification = value;
RaisePropertyChanged("WaitNotification");
}
}
public void DoStuff()
{
WaitPart1On = true;
//Do lots of stuff (really, this is PART 1)
//Notify the UI in the calling application that we're finished PART 1
if (OnFinishedPart1 != null)
{
OnFinishedPart1(this, new ThingEventArgs(NewThing, args));
}
WaitPart1On = false;
}
Und nun Code-Behind aus der XAML, um das ausgelöste Ereignis abzufangen:
public void Part1FinishedEventHandler(NewThing newThing, ThingEventArgs e)
{
//at this point I expected the WaitPart1On to be set to false
//I planned to put a new wait message up (WaitPart2)
FinishPart2();
}