wpf - 如何调试 MVVM 中的数据绑定(bind)问题?

标签 wpf data-binding xaml mvvm

我已经重建了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/

相关文章:

WPF DataGrid ItemsSource 绑定(bind)问题

.net - ClickOnce 部署未按预期安装

c# - MVVM: View 导航无法正常工作

windows - 如何调试 'Xaml.UnhandledExceptionEventArgs'异常?

c# - 检测弹出窗口何时/是否决定重新定位自身

wpf - WPF:逐步绑定(bind)MVVM中的TreeView教程

asp.net-mvc - ASP.NET MVC2 和日期时间格式

silverlight - 如何使用代码隐藏变量作为 ValueConverter 中 ConverterParameter 的输入

wpf - 在 WPF 中,我可以在 ListView 中显示空行而不绑定(bind)任何东西吗?

c# - Datagrid.RowEditEnding 不返回更新值