2009-04-22 5 views
3

Josh Smith's CommandSink exampleをゼロから再構築しました。私のコマンドボタンが灰色表示されているを除いて、エラーなしでが実行されます。これは、コマンドがCanExecute = trueに設定されたり、ある時点でCanExecute = falseに設定されないように、正しく設定されていない場所があるためと考えられます。MVVMでデータバインディングの問題をデバッグするにはどうすればよいですか?

しかし、データバインディングは本質的にXAMLで行われているので、「コマンドにブレークポイントを設定する」とはっきりしないため、ボタンが割り当てられたときにCanExecute = falseまたはCanExecute = trueが割り当てられていません。

基本的に私はビューでこれらのコマンドバインディングを持っている:

<UserControl.CommandBindings> 
    <sink:CommandSinkBinding Command="vm:CustomerViewModel.CloseCommand"/> 
    <sink:CommandSinkBinding Command="vm:CustomerViewModel.ShowInformationCommand"/> 
</UserControl.CommandBindings> 

と私のCustomerViewModelにコマンドは次のように定義されています。今

public static readonly RoutedCommand CloseCommand = new RoutedCommand(); 

public bool CanBeClosed 
{ 
    get { return _customer.IsOpen; } 
} 

public void Close() 
{ 
    _customer.IsOpen = false; 

    this.OnPropertyChanged("CanBeClosed"); 
    this.OnPropertyChanged("CanBeApproved"); 
} 

しかし、MVVMの私の理解以来、あなたがいることですあなたのM-VM-Mをセットアップし、あなたのアプリケーションと物事を「データを束縛して仕事をしてください」を実行してください。

は、私がここで私のコマンドがCanExecute = trueをしているとき、彼らはCanExecute = falseをしている時に見つけるためにステップスルーするASP.NETのように「ページサイクル」のようなものを探していますね。

データバインディングがコード内で明示的に行われていないWPF/MVVMパターンをデバッグするにはどうすればよいでしょうか?したがって、従来の意味でのステップスルーデバッグはできません。

回答:

this article that Gishu mentionedはデータバインディングの問題をデバッグするに取り掛かる、そして一般的にちょうどそれを行う方法についての私の質問に答えにする方法については、一般的に有用であったが、それは私の特定のケースで私を助けていません。何が価値があるために

は、私はジョシュ・スミスの元のコードと行あたりのラインの比較を行うことによって、このコードで私の特定の問題を考え出しとCommandSinkBinding.OnCommandSinkChanged方法から欠落していた次の2行が見つかりました:

if (!ConfigureDelayedProcessing(depObj, commandSink)) 
    ProcessCommandSinkChanged(depObj, commandSink); 
+0

これは重複していますか(少なくとも回答の点で)ですか? [http://stackoverflow.com/questions/337023/how-to-detect-broken-wpf-data-binding](http://stackoverflow.com/questions/337023/how-to-detect-broken- wpf-data-binding)あなたはBea Stollnitzの記事をgoogleでも見ることができます。 – Gishu

+0

答えの部分のリンクは今死んでいます:( –

答えて

0

最初のポイント:

いくつかのプロパティにバインドするときにあなたがして、XAMLファイルにdllをWindowsBaseから診断に を参照を追加することができますバインドXAMLをデバッグするPresentationTraceSources.TraceLevelを追加します。あなたがそれを実行すると、出力ウィンドウをチェックアウトします。

XAMLサンプル:

<TextBlock Text="{Binding someProperty, diagnostics:PresentationTraceSources.TraceLevel=High}"/> 

2点目:

あなたのコマンドがグレー表示されているが、あなたが作品を結合することを意味します!何も起こらないのは、コマンドが状態をリフレッシュせず、CanExe()メソッドが実行され、コマンドを「can not exe state」に設定したことです。しかし、 can exe "と表示されます。これを行うには多くの方法がありますが、基本的には、ViewModelで特定のプロパティが変更されたときに、コマンドの状態をリフレッシュするときに、プリムムでコマンドの状態をリフレッシュします。たとえば、someCommandを呼び出します。RaiseCanExecuteChanged();

+0

この例では、診断プロパティを追加した後の処置についてのガイダンスがありません –

関連する問題