2012-10-02 19 views
5

プロジェクトはMVVMパターンに基づいています。MVVM WPFでUIを更新する方法

私は自分のファイルシステムを示すツリービューを構築しました。 各フォルダには、現在のフォルダを選択するためのチェックボックスがあります。 選択プロセスには時間がかかるため、操作が実行されている間は無効なボタンがあり、操作の最後にボタンを有効にしています。

私の問題は、ボタンが「無効になる」とすぐに見えることです。しかし、ボタンが有効なモードに戻ると、ボタンが有効になっているかどうかを確認するために何らかのアクション(マウスクリックなど)を行う必要があります。

ボタンを有効にした直後にUIが更新されるようにするにはどうすればよいですか?

これらは私のボタンです:

のViewModel
<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の更新は、私は、マウスクリックやキーストロークを実行した直後に発生します。

これは、ボタンを無効にして有効にされたアクションのコードです:私は

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

私は有効なプロパティを変更していますが、Set {...}とSet {}にはOnPropertyChangedイベントが含まれています。すべてをデバッグしようとするとperfevtが動作し、ボタンはクリックなしで有効になります。私は問題が何であるか把握することができます – Ofir

答えて

5

あなたがあなたのコントロールBinding mode TwoWayに調整し、triggers with PropertyChanged

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

私はそれをしましたが、問題はまだ存在しています。 – Ofir

+0

MVVMモデルは、コントロールに通知を送信するためにINotifyPropertyChangedを実装する必要があります –

+0

私は既にそれを実装しました – Ofir

1

を定義することができますここでは、UIを更新するためにメッセージを送信するINotifyPropertyChangedの方法であなたのViewModelを設定する方法のコード例を示します:

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

OKソリューションを見つけました。
私は成功せずにすべてのものを試してみましたが、最終的に私はこのスレッドを見つけました: Refresh WPF Command

私はCommandManager.InvalidateRequerySuggested()

とその作品を使用していました。あなたの助けのための

おかげ

関連する問題