代码之家  ›  专栏  ›  技术社区  ›  Nostromo

命令是如何得到执行CanExecute的通知的?

wpf
  •  0
  • Nostromo  · 技术社区  · 7 年前

    想象一下,你有一个简单的WPF窗口,只有一个 TextBox 还有 Button 在上面。这个 文本框 是的 Text 属性绑定到名为 FileName 还有 按钮 是的 Command 属性绑定到名为 ImportCommand .

    <StackPanel>
        <TextBox Text="{Binding FileName, UpdateSourceTrigger=PropertyChanged}" />
        <Button Content="Import" Command="{Binding ImportCommand}" />
    </StackPanel>
    

    视图模型基本上也是锅炉板代码。

    Public Class MainViewModel
        Inherits ObservableItem
    
        Private _fileName As String
        Private _importCommand As ICommand = New RelayCommand(AddressOf Me.Import, AddressOf Me.CanImport)
    
        Public Sub New()
            Me.FileName = "C:\Temp\temp.dat"
        End Sub
    
        Public Property FileName As String
            Get
                Return _fileName
            End Get
            Set(value As String)
                MyBase.SetProperty(Of String)(_fileName, value)
            End Set
        End Property
    
        Public ReadOnly Property ImportCommand As ICommand
            Get
                Return _importCommand
            End Get
        End Property
    
        Private Sub Import()
            Throw New NotImplementedException
        End Sub
    
        Private Function CanImport() As Boolean
            Return Not String.IsNullOrEmpty(Me.FileName) AndAlso IO.File.Exists(Me.FileName)
        End Function
    
    End Class
    

    两者之间没有明显的联系 文本框 还有 按钮 ,两者之间没有明显的联系 文件名 财产和 进口指令 .

    那么,这个问题是如何解决的呢 进口指令 检测,我可能已经改变了 文件名 属性,并且此更改可能会影响 按钮 这个 进口指令 一定会吗?

    WPF打电话吗 CanExecute 在…上 任何 命令 和 任何 PropertyChanged 发生了什么?对我来说好像有很多不必要的工作?

    0 回复  |  直到 7 年前
        1
  •  1
  •   Wouter    7 年前

    RelayCommad中的CanExecuteChanged事件将侦听CommandManager。RequerySuggest由CommandManager引发的事件。无效查询建议的方法。

    CommandManager再次侦听InputManager KeyUp MouseUp或GotKeyboardFocus或LostKeyboardFocus事件,并调用InvalidateRequestSuggested以通知UI调用该命令的CanExecute方法。