我在网格列上有一个复选框,其中已为其分配了命令。加载窗口以及网格中的每个项目时,即使没有单击复选框,我的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
答案 0 :(得分:0)
您似乎从根本上被误解了可以执行和/或命令。
为了确定用户是否可以运行命令,有一种机制可以查询视图中每个命令的执行。
您可以使用CommandManager.InvalidateRequerySuggested()在代码中调用它
每当与视图进行有意义的用户交互时,也会引发此问题。
返回true-命令可以执行并启用绑定控件,或者返回false并且命令无法执行-禁用控件。
这是您看到的行为。
每次用户单击按钮,键入文本,选择组合项等时,每个命令都可以调用它。
您不应在其中放置一个消息框。这不仅是您可以覆盖的任何旧方法。它应该返回true或false,并且它调用的任何逻辑都应尽可能快地运行。
您已经在命令中显示了一个消息框。我根本不理解为什么您在canexecute中根本没有这段代码,而canexecute应该返回布尔值。我使用c#,但这不是vb中的功能而不是子功能吗?