2009-04-22 60 views
3

我都從頭開始重建Josh Smith's CommandSink example和我的版本沒有錯誤運行除了我的命令按鈕是灰色的。我想這是因爲有一些地方沒有設置正確,這樣永遠不會設置爲CanExecute = true或在某一時刻得到的命令設置爲CanExecute = false。但是由於數據綁定本質上是在XAML中進行的,我不確定在哪裏「設置命令斷點」,因此我可以在什麼時候看到按鈕被分配了CanExecute = false或例如未分配CanExecute = true如何去有關MVVM調試數據綁定的問題?

基本上我有一個觀點,這些命令綁定:

<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,運行你的應用程序,以及「獲得數據綁定和正常工作」的東西。

我想我尋找的東西像「頁面週期」在ASP.NET在其中步,找出當我的命令是CanExecute = true,當他們CanExecute = false

一個人怎麼能去調試像這樣的WPF/MVVM模式在數據綁定不是在代碼完成的明確,因此人們不能在傳統意義上的分步調試通過?

答:

雖然this article that Gishu mentioned在一般關於如何去調試數據綁定的問題,一般回答我如何做到這一點的問題有幫助的,它並沒有幫助我在我的具體情況。

對於它的價值,我想我有這個代碼具體問題出做一個與約什 - 史密斯的原代碼行,每行比較,發現這兩條線路從CommandSinkBinding.OnCommandSinkChanged方法中缺少的:

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文章中看到同樣的內容。 – Gishu 2009-04-22 15:20:22

+0

答案部分中的鏈接現在已經死機:( – 2017-08-03 14:54:30

回答

0

第一點:

要結合一些屬性時調試XAML綁定你可以從WindowsBase DLL來診斷添加到XAML文件參考, 再加入PresentationTraceSources.TraceLevel。當你運行它時檢查輸出窗口。

XAML樣本:

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

觀點二:

您的命令被變灰意味着你綁定的工作!什麼不會發生的是,該命令沒有刷新它的狀態,這意味着CanExe()方法運行,並設置命令「不能EXE狀態」,但它從來沒有再次檢查,如果它可以切換它的狀態恢復到「可以exe「。有很多方法可以做到這一點,但基本上,當你的視圖模型某個屬性的變化,刷新你的命令狀態:

在棱鏡

,例如,你可以調用someCommand。RaiseCanExecuteChanged();