WPF DelegateCommand如何控制何时可以调用CanExecute方法

时间:2019-12-11 19:25:54

标签: wpf vb.net delegatecommand

我在网格列上有一个复选框,其中已为其分配了命令。加载窗口以及网格中的每个项目时,即使没有单击复选框,我的CanExecute方法也会触发。我最后关闭了一个消息框对话框循环。

如果焦点没有丢失,它似乎不会经常触发,但是在单击框之前它仍在触发。

理想情况下,除非我选中此复选框,否则我希望它根本不运行。我正在使用Microsoft.VisualStudio.Utilities中的DelegateCommand。

<DataGrid ItemsSource="{Binding Employees}" CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Register">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox Command="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.CheckboxRegisterCommand}"></CheckBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

和视图模型:

Public Property CheckboxRegisterCommand As DelegateCommand
Public Sub New()
    CheckboxRegisterCommand = New DelegateCommand(AddressOf Register, AddressOf CanRegister)

    Employees = New ObservableCollection(Of Employee) From
    {
        New Employee(),
        New Employee(),
        New Employee()
    }
End Sub

Private Function CanRegister() As Boolean
    MessageBox.Show("Can Register..")
    Return True
End Function
Private Sub Register()
    MessageBox.Show("Registering")
End Sub

1 个答案:

答案 0 :(得分:0)

您似乎从根本上被误解了可以执行和/或命令。

为了确定用户是否可以运行命令,有一种机制可以查询视图中每个命令的执行。

您可以使用CommandManager.InvalidateRequerySuggested()在代码中调用它

https://docs.microsoft.com/en-us/dotnet/api/system.windows.input.commandmanager.invalidaterequerysuggested?view=netframework-4.8#System_Windows_Input_CommandManager_InvalidateRequerySuggested

每当与视图进行有意义的用户交互时,也会引发此问题。

返回true-命令可以执行并启用绑定控件,或者返回false并且命令无法执行-禁用控件。

这是您看到的行为。

每次用户单击按钮,键入文本,选择组合项等时,每个命令都可以调用它。

您不应在其中放置一个消息框。这不仅是您可以覆盖的任何旧方法。它应该返回true或false,并且它调用的任何逻辑都应尽可能快地运行。

您已经在命令中显示了一个消息框。我根本不理解为什么您在canexecute中根本没有这段代码,而canexecute应该返回布尔值。我使用c#,但这不是vb中的功能而不是子功能吗?