Отмена снимите флажок в WPF - PullRequest
1 голос
/ 25 мая 2010

Я использую флажок в окне WPF. Я использую некоторую логику в непроверенном событии флажка. И я хочу отменить снятие отметки, если это необходимо в теле этого события. Как я могу это сделать?

    private void chApprove_Checked(object sender, RoutedEventArgs e)
    {
        btnAddDepartment.IsEnabled = true;
        brnRemoveDepartment.IsEnabled = true;
    }

    private void chApprove_Unchecked(object sender, RoutedEventArgs e)
    {
        if (lbSource.Count == 0)
        {
            btnAddDepartment.IsEnabled = false;
            brnRemoveDepartment.IsEnabled = false;
        }
        else
        {
            MessageBox.Show("Staff already in use! Release it first from dependecies!");
            CheckBox myCheckBox = e.Source as CheckBox;
            myCheckBox.IsChecked = true;


        }
    }

Невозможно отменить снятие отметки !!!

Ответы [ 4 ]

5 голосов
/ 25 мая 2010
void CheckBox1_Unchecked(object sender, RoutedEventArgs e)
{
    if(ResultOfSomeLogic)
    {    
        CheckBox myCheckBox = e.Source as CheckBox;
        myCheckBox.IsChecked = True; // Check it again
    }
    else
    {
    }
}

Также обратите внимание на поведение привязки EventToCommand в MVVM Light, чтобы воспользоваться преимуществом метода CanExecute.

1 голос
/ 25 мая 2010

Вы можете легко сделать это с помощью прикрепленного поведения (вместо использования кода позади), вы можете взглянуть на этот ответ , если вам нужен пример того, как его структурировать (это всего несколько строк). кода).

Мое чувство паука говорит мне, что это не очень хорошая идея - я не могу представить способ «оправдать» перепроверку флажка, на который нажал пользователь, это просто поразило меня. Не можете ли вы либо связать включенное состояние флажка со свойством в вашей ViewModel, либо, если к нему привязана ICommand, использовать делегат CanExecute, чтобы включить / отключить его на основе той же логики?

0 голосов
/ 06 февраля 2017

В моем случае я не мог использовать решение, которое изначально позволяло снять отметку. Если проверенное состояние инициирует критическую асинхронную операцию, не всегда идеально снимать флажок, чтобы просто проверить его еще раз: зачем разрешать отменять эту операцию, если ее нельзя было вообще отменить?

Для MenuItem s вы можете подписаться на событие PreviewMouseDown и установить IsCheckable в false ; затем подпишитесь на событие Click и установите IsCheckable обратно на true . Причина этого в том, что IsCheckable просто определяет, следует ли инициировать изменение состояния, в отличие от IsHitTestEnabled="false" и IsEnabled="False", что остановит все события от запуска.

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

К сожалению, CheckBox не имеет эквивалентного свойства IsCheckable; однако те же самые концепции, описанные выше (т. е. шаблон PreviewMouseDown, Click), могут дать аналогичный, если не идентичный, результат.

0 голосов
/ 25 мая 2010

Свяжите свойство IsChecked флажка. Как

IsChecked="{Binding IsChecked, Mode = TwoWay}"

и в вашем классе определите что-то вроде dis;

private bool isChecked;

public bool IsChecked
{
  get
   {
     return this.isChecked;
   }

  set
  {
    this.isChecked = value;
    OnPropertyChanged["IsChecked"];
  }

}

и в вашем случае

void CheckBox1_Unchecked(object sender, RoutedEventArgs e)
{
    if(ResultOfSomeLogic)
    {    
        this.IsChecked = true;
    }
    else
    {
    }
}

надеюсь, это сработает для тебя ..

Удачи ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...