WPF DelegateCommand, как контролировать, когда вызывается метод CanExecute. - PullRequest
0 голосов
/ 11 декабря 2019

У меня есть флажок в столбце сетки, которому назначена команда. Мой метод CanExecute срабатывает, когда я загружаю окно и для каждого элемента в сетке, даже если я не установил флажок. Я заканчиваю с циклом диалоговых окон сообщения, чтобы закрыть.

Кажется, что он срабатывает не так часто, если фокус не потерян, но он все еще срабатывает до того, как я щелкну на поле.

В идеале, я бы хотел, чтобы он вообще не работалесли я не проверю флажок. Я использую DelegateCommand из Microsoft.VisualStudio.Utilities .

<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 голосов
/ 12 декабря 2019

Вы, по-видимому, в корне неправильно поняли, что можно выполнить и или выполнить команду.

Чтобы определить, могут ли пользователи выполнять команду, существует механизм, который запрашивает выполнение каждой команды, имеющейся в представлении.

Вы можете вызвать это в коде, используя 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, и любая логика, которую он вызывает, должна выполняться настолько быстро, насколько это возможно.

Вы уже показываете окно сообщения в команде. Я не понимаю, почему у вас есть этот код в canexecute, а canexecute должен возвращать bool. Я делаю c #, но разве это не функция в vb, а не sub?

...