Значение поля со списком изменяется, но визуально SelectedValue остается прежним - PullRequest
1 голос
/ 10 июля 2020

У меня есть поле со списком с настраиваемым перечислением (только true / false). У меня есть функция, которая проверяет условия, если SelectedValue изменяется с false на true, и если условия неверны, она меняет поле со списком SelectedValue обратно на false. Это изменяет SelectedValue на false, если вы проверяете его в коде, но когда вы смотрите на пользовательский интерфейс, он все еще имеет значение true.

Вот xaml для поля со списком:

<ComboBox x:Name="comboEnabled1" Width="80" Height="26"
                          ItemsSource="{Binding Path=TrueFalseChoices}"
                          SelectedValue="{Binding Path=Enable1, Mode=TwoWay}"/>
            

Вот модель просмотра

private TrueFalse _enable1 = TrueFalse.False;
    public TrueFalse Enable1
    {
        get { return _enable1; }
        set
        {
            if (_enable1 != value)
            {
                _enable1 = value;
                base.OnPropertyChanged("Enable1");
                OnEnableChanged(EventArgs.Empty);
            }
        }
    }

А вот функция, которую я использую для проверки условий

public void HandleEnable(object sender, EventArgs e)
    {
        if(Enable1 == TrueFalse.True)
        {
            if(!connected)
            {
                HandleMessage("Can't enable, not connected");
                Enable1 = TrueFalse.False;
            }
            else if (!_main.CBCheck(_main.cbReason))
            {
                Enable1 = TrueFalse.False;
            }

        }
        Console.WriteLine("Enabled {0}", Enable1);

    }

Я думал, что меняю значение слишком быстро, но последняя версия Console.Writeline выдает правильный результат каждый раз.

Любая помощь приветствуется!

Edit: Calling Handleenable здесь:

protected void OnEnableChanged(EventArgs e)
    {
        EventHandler handler = EnableChanged;
        if (handler != null)
            handler(this, e);
    }

И в функции ViewModel:

        EnableChanged += HandleEnable;

Изменение Enable1 в любом другом месте сработало так, как должно было, только возникли проблемы с функцией HandleEnable. Также попытался изменить другие поля со списком в функции HandleEnable, и это сработало так, как должно было.

1 Ответ

0 голосов
/ 10 июля 2020

Я бы порекомендовал отключить ComboBox, если требования не выполняются.

Но если вы настаиваете на возврате Enable1 обратно к False, если условия не выполняются, вы должны sh правильно отправить уведомление через диспетчер.

set
{
    var effectiveValue = condition ? value : TrueFalse.False;
    if (effectiveValue == TrueFalse.False && value == TrueFalse.True)
        System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke(
            new Action(() => base.OnPropertyChanged("Enable1"), null));
    //your regular set-code follows here
}

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

Но я все же рекомендовал бы отключить ComboBox, когда он фактически отключен. Доступ к диспетчеру из модели просмотра неприятно пахнет, как бы вы на это ни смотрели.

UPD: вы также можете решить эту проблему с помощью {Binding Enable1, Delay=10}, если ваша структура 4.5.1 +.

...