0

我在网格列上有一个复选框,它分配了一个命令。我的 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
4

1 回答 1

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中的一个函数而不是一个子函数吗?

于 2019-12-12T10:55:55.247 回答