내 프로젝트는 MVVM 패턴을 기반으로합니다.MVVM에서 UI 새로 고침 WPF
나는 내 파일 시스템을 보여주는 트리보기를 만들었습니다. 각 폴더에는 현재 폴더를 선택하기위한 확인란이 있습니다. 선택 과정에 약간의 시간이 걸리므로 작업이 실행되는 동안 비활성화 된 버튼이 있으며 작업이 끝나면 버튼이 활성화됩니다.
내 문제는 버튼이 "사용 안 함"으로 설정되면 즉시 확인된다는 것입니다. 그러나 버튼이 활성화 된 모드로 돌아갈 때 나는 마우스 클릭과 같은 몇 가지 작업을 수행하여 버튼이 활성화 된 것을 확인해야합니다.
버튼이 활성화 된 후 UI가 즉시 업데이트되도록하려면 어떻게해야합니까? 나는이 코드를 추가 내 뷰 모델에서
<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를 업데이트 내가 마우스 클릭이나 키 스트로크 (keystroke)를 실행 직후에 발생합니다.
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' 이벤트를 발생하는 수행하려고? –
내가 할 때 나는 enabled 속성을 변경했지만 Set {...}과 Set {}에는 OnPropertyChanged 이벤트가 포함되어있다. 모든 것을 디버그하려고 할 때 perfevt가 작동하고 버튼이 클릭없이 활성화됩니다. 문제가 무엇인지 파악할 수 있습니다. – Ofir