c # wpf - & gt; listbox предотвратить выбранный элемент [duplicate]

Я просто добавил float:left в div, и он работал

17
задан Rob 6 March 2012 в 21:10
поделиться

6 ответов

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

WPF: Отменить выбор пользователя в привязке к данным ListBox?

FYI, это решение на основе MV-VM (если вы aren используя шаблон MV-VM, вы должны быть!) [/ ​​g3]

16
ответ дан Community 17 August 2018 в 23:40
поделиться
  • 1
    ИДЕАЛЬНО! СПАСИБО! – 00jt 3 December 2012 в 19:58
  • 2
    Апхек, я тебя люблю – MxFragz 24 May 2016 в 15:19
  • 3
    Ввод этой логики в Property setter - плохая практика. Если что-то другое, кроме ComboBox / ListBox, изменит это свойство, разработчик, создающий его, будет просто изменять значение, а не открывать диалоговое окно. Это уменьшает гибкость свойства – MarkyDD 27 September 2016 в 13:35
  • 4
    На самом деле это смущает. Как помещать MessageBox в виртуальную (!!!) хорошую практику MVVM? Решение позади кода было бы намного больше MVVM, потому что оно сохраняло бы View View (отображение диалога) в представлении. – Benjamin Krupp 16 August 2018 в 09:20

Я не верю, что диспетчер может отправить сообщение (или задержать) обновление свойств - это хорошее решение, это скорее обходной путь, который на самом деле не нужен. Следующее решение i полностью mvvm и не требует диспетчера.

  • Сначала привяжите выбранный элемент с явным режимом привязки. // это позволяет нам решить, следует ли компилировать с использованием метода UpdateSource () изменения в виртуальной машине или для возврата с использованием метода UpdateTarget () в пользовательском интерфейсе.
  • Затем добавьте метод для виртуальной машины, который подтверждает, разрешено ли изменение (этот метод может содержать службу, которая запрашивает подтверждение пользователя и возвращает bool).

В коде представления за крючком к событию SelectionChanged и обновлению источника (то есть виртуальной машины) или цели (то есть V) в соответствии с тем, возвращал ли метод VM.ConfirmChange (...) следующее значение:

    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if(e.AddedItems.Count != 0)
        {
            var selectedItem = e.AddedItems[0];
            if (e.AddedItems[0] != _ViewModel.SelectedFormatType)
            {
                var comboBoxSelectedItemBinder = _TypesComboBox.GetBindingExpression(Selector.SelectedItemProperty); //_TypesComboBox is the name of the ComboBox control
                if (_ViewModel.ConfirmChange(selectedItem))
                {
                    // Update the VM.SelectedItem property if the user confirms the change.
                    comboBoxSelectedItemBinder.UpdateSource();
                }
                else
                {
                    //otherwise update the view in accordance to the VM.SelectedItem property 
                    comboBoxSelectedItemBinder.UpdateTarget();
                }
            }
        }
    }
0
ответ дан Ahmad 17 August 2018 в 23:40
поделиться

Возможно, создайте класс, полученный из ComboBox, и переопределите OnSelectedItemChanged (Или OnSelectionChangeCommitted.)

1
ответ дан ispiro 17 August 2018 в 23:40
поделиться
  • 1
    Да, я тоже думал об этом, я бы хотел увидеть реализацию. – CRice 23 September 2014 в 06:47

Я нашел эту хорошую реализацию.

 private bool handleSelection=true;

private void ComboBox_SelectionChanged(object sender,
                                        SelectionChangedEventArgs e)
        {
            if (handleSelection)
            {
                MessageBoxResult result = MessageBox.Show
                        ("Continue change?", MessageBoxButton.YesNo);
                if (result == MessageBoxResult.No)
                {
                    ComboBox combo = (ComboBox)sender;
                    handleSelection = false;
                    combo.SelectedItem = e.RemovedItems[0];
                    return;
                }
            }
            handleSelection = true;
        }

источник: http://www.amazedsaint.com/2008/06/wpf-combo-box-cancelling-selection.html

18
ответ дан Jaider 17 August 2018 в 23:40
поделиться

Проверка в обработчике события SelectionChanged позволяет отменить вашу логику, если выбор недействителен, но я не знаю, как легко отменить выбор события или элемента.

Мое решение заключался в подклассе combo-box WPF и добавлении внутреннего обработчика для события SelectionChanged. Всякий раз, когда срабатывает событие, мой частный внутренний обработчик вместо этого запускает собственное SelectionChanging событие.

Если свойство Cancel установлено на соответствующем SelectionChangingEventArgs, событие не поднимается, а SelectedIndex возвращается к своему предыдущему значению. В противном случае создается новый SelectionChanged, который затеняет базовое событие. Надеюсь, это поможет!


EventArgs и делегат обработчика для события SelectionChanging:

public class SelectionChangingEventArgs : RoutedEventArgs
{
    public bool Cancel { get; set; }
}

public delegate void 
SelectionChangingEventHandler(Object sender, SelectionChangingEventArgs e);

Внедрение класса ChangeComboBox:

public class ChangingComboBox : ComboBox
{
    private int _index;
    private int _lastIndex;
    private bool _suppress;

    public event SelectionChangingEventHandler SelectionChanging;
    public new event SelectionChangedEventHandler SelectionChanged;

    public ChangingComboBox()
    {
        _index = -1;
        _lastIndex = 0;
        _suppress = false;
        base.SelectionChanged += InternalSelectionChanged;
    }

    private void InternalSelectionChanged(Object s, SelectionChangedEventArgs e)
    {
        var args = new SelectionChangingEventArgs();
        OnSelectionChanging(args);
        if(args.Cancel)
        {
            return;
        }
        OnSelectionChanged(e);
    }

    public new void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        if (_suppress) return;

        // The selection has changed, so _index must be updated
        _index = SelectedIndex;
        if (SelectionChanged != null)
        {
            SelectionChanged(this, e);
        }
    }

    public void OnSelectionChanging(SelectionChangingEventArgs e)
    {
        if (_suppress) return;

        // Recall the last SelectedIndex before raising SelectionChanging
        _lastIndex = (_index >= 0) ? _index : SelectedIndex;
        if(SelectionChanging == null) return;

        // Invoke user event handler and revert to last 
        // selected index if user cancels the change
        SelectionChanging(this, e);
        if (e.Cancel)
        {
            _suppress = true;
            SelectedIndex = _lastIndex;
            _suppress = false;
        }
    }
}
1
ответ дан Rob 17 August 2018 в 23:40
поделиться

В WPF динамически устанавливается объект с помощью

    if (sender.IsMouseCaptured)
    {
      //perform operation
    }
0
ответ дан Subhash Saini 17 August 2018 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: