WPF устанавливает ComboBox на -1 индекс после события щелчка проблемы ComboBoxItem - PullRequest
0 голосов
/ 02 октября 2018

У меня есть выпадающий список, который содержит мои категории.В этом поле со списком у меня также есть элемент с именем <- NEW CATEGORY ->, в котором есть событие щелчка.Сейчас давайте забудем о том, что он открывает новое окно или диалоговое окно для добавления новой категории ... теперь я хочу, чтобы при выборе <- NEW CATEGORY -> в поле со списком выбранный индекс изменялся на -1.

<ComboBox x:Name="testcombo" HorizontalAlignment="Left" Margin="268,213,0,0" VerticalAlignment="Top" Width="120" Background="#FFC58383" DisplayMemberPath="data" SelectedValuePath="id">

                <ComboBox.ItemContainerStyle>
                    <Style TargetType="ComboBoxItem">
                        <EventSetter Event="PreviewMouseLeftButtonUp" Handler="ComboBoxItem_PreviewMouseLeftButtonUp"/>
                    </Style>
                </ComboBox.ItemContainerStyle>
</ComboBox>

и c #

namespace WpfApp4
{
    public partial class MainWindow : Window
    {
        public class Modell
        {
            public int id { get; set; }
            public string data { get; set; }
        }

        public MainWindow()
        {
            InitializeComponent();
            testcombo.Items.Add(new Modell { id = 0, data = "<--NEW-->" });
            testcombo.Items.Add(new Modell { id = 1 , data = "dddd" });
            testcombo.Items.Add(new Modell { id = 2, data = "dddzxcd" });
            testcombo.Items.Add(new Modell { id = 3, data = "ddczdd" });
        }



        private void ComboBoxItem_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            var cat_obj = (sender as ComboBoxItem).Content as Modell;

            if (cat_obj.id == 0)
            {
                testcombo.SelectedIndex = -1;
                //MessageBox.Show("", "", MessageBoxButton.OK);
            }

        }
    }
}

Проблема в том, что приведенный выше код не меняет индекс на -1, но когда я добавляю окно сообщения после или перед строкой testcombo.SelectedIndex = -1;, это работает: |

примечание: Я не могу сделать индекс до -1 в выпадающем списке SelectionChanged, поскольку в основном проекте у меня есть событие keyUp, которое выбирает элемент с помощью клавиатуры arrowUp / Down

1 Ответ

0 голосов
/ 02 октября 2018

Используйте Dispatcher, чтобы заставить его работать:

private void ComboBoxItem_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    var cat_obj = (sender as ComboBoxItem).Content as Modell;

    if (cat_obj.id == 0)
    {
        Dispatcher.BeginInvoke((Action)(() => { testCombo.SelectedIndex = -1; }));
        //MessageBox.Show("", "", MessageBoxButton.OK);
    }

}

Другое решение может быть:

private void ComboBoxItem_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    var cat_obj = (sender as ComboBoxItem).Content as Modell;

    if (cat_obj.id == 0)
    {
        testCombo.SelectedIndex = -1;
        e.Handled = true;
        testCombo.IsDropDownOpen = false;
    }
}

Проблема заключалась в том, что combobx делает выбор элемента после того, как MouseLeftButtonUp происходити так переопределить SelectedIndex = -1;.С Dispatcher вы переопределяете SelectedIndex, который был установлен с помощью мыши.Со вторым решением e.Handled = true; выпадающий список вообще не выбирает элемент, но затем вам нужно закрыть раскрывающийся список вручную.

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