Wie kann ich das aktualisieren der UI in WPF-MVVM

Mein Projekt basiert auf dem MVVM-pattern.

Habe ich gebaut, einen Baum-Ansicht, die zeigt, dass mein Datei-system.
Jeder Ordner hat eine checkbox für die Auswahl des aktuellen Ordners.
Das Auswahlverfahren wird einige Zeit nehmen, so, während die operation läuft, es ist ein Knopf, der ist deaktiviert und am Ende der operation bin ich aktivieren der Schaltfläche.

Mein problem ist, dass, wenn wird der button "deaktiviert" sehe ich es sofort. Allerdings, wenn Sie auf die Schaltfläche zurück, um den aktivierten Modus muss ich einige Aktionen (wie Mausklick) auf die Schaltfläche aktiviert.

Wie kann ich sicherstellen, dass das UI wird sofort aktualisiert, nachdem der button aktiviert ist?

Diese sind meine buttons:

<Button Content="&lt;- Back" Margin="5,0,5,0" Width="80" Height="25"
        IsEnabled="{Binding CanMoveToPreviousPage, UpdateSourceTrigger=PropertyChanged}" 
        Command="{Binding Path=NavigateBackCommand, IsAsync=True}" />

<Button Content="{Binding ButtonNextCaption}" Margin="5,0,5,0" Width="80" Height="25"
        IsEnabled="{Binding CanMoveToNextPage, UpdateSourceTrigger=PropertyChanged}" 
        Command="{Binding Path=NavigateNextCommand, IsAsync=True}" />

In meinem ViewModel fügte ich diesen code:

public bool CanMoveToNextPage
{
    get
    {
        return this.CurrentPage != null && this.CurrentPage.CanMoveNext;
    }
    set
    {
        if (CurrentPage != null)
        {
            this.CurrentPage.CanMoveNext = value;
            OnPropertyChanged("CanMoveToNextPage");
        }
    }
}

public bool CanMoveToPreviousPage
{
    get { return 0 < this.CurrentPageIndex && CurrentPage.CanMoveBack; }
    set
    {
        if (CurrentPage != null)
        {
            this.CurrentPage.CanMoveBack = value;
            OnPropertyChanged("CanMoveToPreviousPage");
        }
    }
}

Den UI-update passiert, kurz nachdem ich ausgeführt einem Mausklick oder jeder Tastatureingabe.

Dies ist der code für die Aktion, aktivieren und deaktivieren der Tasten:

void bg_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
    DecrementDoneCounter();
    if (ThreadSafeCouner == 0)//means all bg workers are done
    {
        UIlimitation(true);
    }
}

private int ThreadSafeCouner; //check how many bgworkers run
public void IncrementDoneCounter() { Interlocked.Increment(ref ThreadSafeCouner); }
public void DecrementDoneCounter() { Interlocked.Decrement(ref ThreadSafeCouner); }


void bg_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    IncrementDoneCounter();
    UIlimitation(false);
    ((bgArguments)e.Argument).SelectedDirectory.CanSelected = false;
    MarkItems(((bgArguments)e.Argument).SelectedDirectory, ((bgArguments)e.Argument).IsSelect);
    ((bgArguments)e.Argument).FreeWorkerAllocation();
    ((bgArguments)e.Argument).SelectedDirectory.CanSelected = true;
}

//this is the enabling action which execute the propeties setters at the upper part of this post
private static void UIlimitation(bool limit)
{
    MainWindowViewModel.Instance.CanMoveToNextPage = limit;
    MainWindowViewModel.Instance.CanMoveToPreviousPage = limit;
}

Was kann ich tun?

dies versuchen.UpdateLayout() oder ButtonsParent.UpdateLayout()
Wenn Ihre operation erfolgt, sind Sie die Erhöhung der OnPropertyChanged - Ereignis für das betreffende Eigenschaften, die verantwortlich für die Aktivierung/Deaktivierung der Schaltfläche?
Wenn ich getan, ich bin ändern der enabled-Eigenschaft, sondern Gesetzt{...} und Set{} gehören die OnPropertyChanged-event. Wenn ich versuche zu Debuggen, funktioniert alles perfevt und der button aktiviert wird, ohne zu klicken. Ich kann es herausfinden, was das problem ist
Ich habe den code Hinzugefügt, wenn ich das Ereignis auslösen. Vielen Dank für Eure Hilfe

InformationsquelleAutor Ofir | 2012-10-02

Schreibe einen Kommentar