2012-10-02 2 views
5

내 프로젝트는 MVVM 패턴을 기반으로합니다.MVVM에서 UI 새로 고침 WPF

나는 내 파일 시스템을 보여주는 트리보기를 만들었습니다. 각 폴더에는 현재 폴더를 선택하기위한 확인란이 있습니다. 선택 과정에 약간의 시간이 걸리므로 작업이 실행되는 동안 비활성화 된 버튼이 있으며 작업이 끝나면 버튼이 활성화됩니다.

내 문제는 버튼이 "사용 안 함"으로 설정되면 즉시 확인된다는 것입니다. 그러나 버튼이 활성화 된 모드로 돌아갈 때 나는 마우스 클릭과 같은 몇 가지 작업을 수행하여 버튼이 활성화 된 것을 확인해야합니다.

버튼이 활성화 된 후 UI가 즉시 업데이트되도록하려면 어떻게해야합니까? 나는이 코드를 추가 내 뷰 모델에서

<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}" /> 

:

내 버튼입니다

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; 
} 

내가 무엇을 할 수

이 버튼을 비활성화하고 활성화되는 작업의 코드?

+1

는 this.UpdateLayout() 또는 ButtonsParent.UpdateLayout() –

+0

이 때 작업이 버튼을 활성화/비활성화에 대한 책임 귀하의 우려 속성에 대한'OnPropertyChanged' 이벤트를 발생하는 수행하려고? –

+0

내가 할 때 나는 enabled 속성을 변경했지만 Set {...}과 Set {}에는 OnPropertyChanged 이벤트가 포함되어있다. 모든 것을 디버그하려고 할 때 perfevt가 작동하고 버튼이 클릭없이 활성화됩니다. 문제가 무엇인지 파악할 수 있습니다. – Ofir

답변

5

당신은 당신의 통제 Binding mode TwoWay에 조정할 수 있으며, 다음은 UI 업데이트 할 메시지를 보내는에서 INotifyPropertyChanged 방법으로 뷰 모델을 설정하는 방법의 코드 예제 triggers with PropertyChanged

{Binding ElementName=.., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} 
+0

나는 그것을했지만 문제는 여전히 존재합니다. – Ofir

+0

MVVM 모델은 컨트롤에 알림을 보내려면 INotifyPropertyChanged를 구현해야합니다. –

+0

이미 구현했습니다. – Ofir

1

을 정의

public class MyViewModel : INotifyPropertyChanged 
{ 
    /******************************************************/ 
    /* Property that you have created two-way binding for */ 
    /******************************************************/ 
    private double _myProperty 
    public double MyProperty 
    { 
     get { return _myProperty; } 
     set 
     { 
      _myProperty = value; 

      OnNotifyPropertyChanged("MyProperty"); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnNotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion INotifyPropertyChanged Members 
} 
+1

안녕하세요, 내 프로젝트에 이미이 코드가 포함되어 있습니다. – Ofir

+0

OnNotifyPropertyChanged ("MyProperty") 값을 확인하십시오. 맞아. –

1

확인 해결책을 찾았습니다.
내가 성공하지 않고 모든 노력을 결국 나는이 스레드 발견 : 나는 CommandManager.InvalidateRequerySuggested()

그리고 그 작품을 사용했다 Refresh WPF Command

합니다. 당신의 도움에 대한

덕분에