【问题标题】:What if parent object in property path is null?如果属性路径中的父对象为空怎么办?
【发布时间】:2017-12-20 13:16:46
【问题描述】:

如果属性路径中的父对象之一为空,我们如何控制会发生什么?例如:

<Button Command="{Binding ActiveDrawing.PrintCommand}" />

如果ActiveDrawing 为空怎么办?我希望在这种情况下禁用此按钮,但 WPF 保持启用状态。我尝试将FallBackValue 设置为null,如下所示:

<Button Command="{Binding ActiveDrawing.PrintCommand, FallbackValue={x:Null}}" />

但这并没有什么不同。该按钮保持启用状态。

注意将TargetNullValue 设置为{x:Null} 也没有什么区别。

【问题讨论】:

  • 实现一个 PrintCommand ,并在 CanExecute 中检查 ActiveDrawing.PrintCommand。移除直接耦合。
  • 我确实实现了 PrintCommandCanExecute。问题是,如果ActiveDrawing 为空,WPF 将无法评估CanExecute。如果您要我将我的所有命令从 ActiveDrawing 移动到当前上下文,那是一项太大的任务。我相信应该有一种简单的方法来指定一个值,以防绑定评估由于某种原因而失败。
  • 事实上,我希望FallbackValue 仅用于此目的,但不知何故,它并没有像我预期的那样工作。

标签: wpf xaml binding


【解决方案1】:

我现在设计了以下解决方法。

  1. 创建一个名为NullCommand的新类:

    Public Class NullCommand
      Implements ICommand
    
      Public Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged
    
      Public Sub Execute(parameter As Object) Implements ICommand.Execute
      End Sub
    
      Public Function CanExecute(parameter As Object) As Boolean Implements ICommand.CanExecute
        Return False
      End Function
    End Class
    
  2. 在资源部分创建一个类的实例:

    <Window.Resources>
      <vm:NullCommand x:Key="NullCommand" />
    </RibbonGroup.Resources>
    
  3. 将此对象用作您的 FallbackValue:

    <Button Command="{Binding ActiveDrawing.PrintCommand, FallbackValue={StaticResource NullCommand}" />
    

万岁!有用。每当绑定属性路径因任何原因失败时,您的按钮将被禁用。

TBH,我不喜欢这个解决方案的唯一原因。 FallbackValue 应该已经处理了这种情况。

【讨论】:

    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多