プロジェクトはMVVMパターンに基づいています。MVVM WPFでUIを更新する方法
私は自分のファイルシステムを示すツリービューを構築しました。 各フォルダには、現在のフォルダを選択するためのチェックボックスがあります。 選択プロセスには時間がかかるため、操作が実行されている間は無効なボタンがあり、操作の最後にボタンを有効にしています。
私の問題は、ボタンが「無効になる」とすぐに見えることです。しかし、ボタンが有効なモードに戻ると、ボタンが有効になっているかどうかを確認するために何らかのアクション(マウスクリックなど)を行う必要があります。
ボタンを有効にした直後にUIが更新されるようにするにはどうすればよいですか?
これらは私のボタンです:
私 のViewModelで<Button Content="<- 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}" />
私はこのコードを追加:
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");
}
}
}
UIの更新は、私は、マウスクリックやキーストロークを実行した直後に発生します。
これは、ボタンを無効にして有効にされたアクションのコードです:私は
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;
}
何ができますか?
this.UpdateLayout()またはButtonsParent.UpdateLayoutを(してみてください) –
あなたの操作が行われているボタンを有効化/無効化を担当するあなたの心配の特性のために 'OnPropertyChanged'イベントを上げていますか? –
私は有効なプロパティを変更していますが、Set {...}とSet {}にはOnPropertyChangedイベントが含まれています。すべてをデバッグしようとするとperfevtが動作し、ボタンはクリックなしで有効になります。私は問題が何であるか把握することができます – Ofir