gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:16:14 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com