我已经重建了Josh Smith's CommandSink example从头开始,我的版本运行没有错误除了我的命令按钮是灰色的。我认为这是因为某些地方没有正确设置,因此命令永远不会设置为 CanExecute = true
或在某些时候设置为 CanExecute = false
。
但由于数据绑定(bind)本质上是在 XAML 中进行的,我不确定在哪里“在命令上设置断点”,所以我可以看到按钮何时被分配 CanExecute = false 或例如未分配 CanExecute = true
。
基本上我在一个 View 中有这些命令绑定(bind):
<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,运行您的应用程序和“获得数据绑定(bind)并正常工作”的事物。
我想我正在寻找类似 ASP.NET 中的“页面循环”的东西,在其中逐步查看我的命令何时为 CanExecute = true
当它们为 CanExecute = false
时。
如果数据绑定(bind)未在代码中显式完成,那么人们如何调试像这样的 WPF/MVVM 模式,因此无法在经典意义上逐步调试?
回答:
虽然this article that Gishu mentioned一般而言,对于如何调试数据绑定(bind)问题很有帮助,并且通常会回答我关于如何做到这一点的问题,但在我的特定情况下它对我没有帮助。
对于它的值(value),我通过与 Josh Smith 的原始代码进行逐行比较来解决我与此代码的特殊问题,并发现 CommandSinkBinding.OnCommandSinkChanged
中缺少的这两行> 方法:
if (!ConfigureDelayedProcessing(depObj, commandSink))
ProcessCommandSinkChanged(depObj, commandSink);
最佳答案
第一点:
要调试 XAML 绑定(bind),您可以将 WindowsBase dll 中的诊断引用添加到 XAML 文件中, 然后在绑定(bind)到某些属性时添加 PresentationTraceSources.TraceLevel。当您运行它时,请检查输出窗口。
XAML 示例:
<TextBlock Text="{Binding someProperty, diagnostics:PresentationTraceSources.TraceLevel=High}"/>
第二点:
您的命令变灰意味着您的绑定(bind)有效!没有发生的是命令没有刷新它的状态,这意味着 CanExe() 方法运行并将命令设置为“无法执行状态”,但是它永远不会再次检查它是否可以将其状态切换回“可以执行”。有很多方法可以做到这一点,但基本上当您的 ViewModel 中的某个属性发生变化时,刷新您的命令状态:
在 Prism 中,例如您可以调用 someCommand.RaiseCanExecuteChanged ();
关于wpf - 如何调试 MVVM 中的数据绑定(bind)问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/777612/