2016-11-10 3 views
0

Goal У меня есть Combobox в WPF и всякий раз, когда пользователь выбирает элемент из Combobox. Я хочу закрыть Combobox (отображающее старое значение как выбранное значение) и отображать MessageBox с помощью Ok/Отмена. Если пользователь нажимает «ОК», новое выбранное значение должно быть установлено иначе, которое оно должно вернуть.WPF: Закрыть combobox при выборе и отображении элементов. Поле сообщения

Проблема Когда я выбираю элемент, я могу отображать MessageBox вместе с Combobox open, чего я не хочу. Как только пользователь выберет что-то, я хочу закрыть Combobox и отобразить Messagebox.

Как я могу это сделать?

XMAL код

<ComboBox Name="Currency" Grid.Row="1" Grid.Column="5" ItemsSource="{Binding comboboxSource}" 
         SelectedValuePath="Value.bank_currency" IsReadOnly="False" IsTextSearchEnabled="True" TextSearch.TextPath="Value.bank_currency" 
         SelectedItem="{Binding SelectedBankCurrency, UpdateSourceTrigger=LostFocus,Mode=Twoway}"> 

C# Код

public KeyValuePair<string, bankCurrencyObject>? SelectedBankCurrency 
    { 
     get { return _selectedCurrency; } 
     set 
     { 
       MessageBoxResult result = MessageBox.Show("Are you sure you want to change the currency?", 
         "Warning", 
         MessageBoxButton.OKCancel, 
         MessageBoxImage.Question); 

       if (result == MessageBoxResult.Cancel) 
       { 
        return; 
       } 
       else 
       { 
        //set values 
       } 
    } 
    } 

Попытка использования SelectionChanged событие, но это не сработало,

private void Combobox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (DataContext == null) 
      return; 
     var combo = (sender as ComboBox); 

     if (combo != null && combo.IsDropDownOpen) 
     { 
      combo.IsDropDownOpen = false; 
      var binding = combo.GetBindingExpression(ComboBox.SelectedItemProperty); 

      binding.UpdateSource(); 
      binding.UpdateTarget(); 
     } 
    }` 
+0

', если (результат = MessageBoxResult.Cancel!) _selectedCurrency = значение;' – Vyrira

+0

@Vyrira Я попытался это, но с этим тоже Combobox не близко и пересекаться с MessageBox – S52

+0

Не у вас есть доступ к валюте поле со списком? Вы можете установить «Currency.IsDropDownOpen = false;» перед показом MessageBox. – Vyrira

ответ

0

Вы можете охватить задачу в пуле потоков .Net и отобразить окно сообщения через диспетчера.

0

Вы можете сделать это на мероприятии SelectionChanged.

Поле selectedItem отслеживает ранее выбранный элемент, чтобы он не показывал MessageBox, когда нет смены валюты. Если выбранный элемент изменен, он скрывает меню DropDown перед показом MessageBox. Затем, если пользователь нажал кнопку «Отменить», он вернет изменение, иначе он сохранит текущий выбор в selectedItem, чтобы сравнить его в будущем.

private object selectedItem = null; 

private void Currency_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (Currency.SelectedItem == selectedItem) 
     return; 

    Currency.IsDropDownOpen = false; 

    MessageBoxResult result = MessageBox.Show("Are you sure you want to change the currency?", 
      "Warning", 
      MessageBoxButton.OKCancel, 
      MessageBoxImage.Question); 

    if (result == MessageBoxResult.Cancel) 
     Currency.SelectedItem = selectedItem; 
    else 
     selectedItem = Currency.SelectedItem; 
}