Почему я не могу выбрать нулевое значение в ComboBox?

Класс имеет эффективный метод перетасовки, который можно скопировать, чтобы не зависеть от него:

/**
 * Usage:
 *    int[] array = {1, 2, 3};
 *    Util.shuffle(array);
 */
public class Util {

    private static Random random;

    /**
     * Code from method java.util.Collections.shuffle();
     */
    public static void shuffle(int[] array) {
        if (random == null) random = new Random();
        int count = array.length;
        for (int i = count; i > 1; i--) {
            swap(array, i - 1, random.nextInt(i));
        }
    }

    private static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

42
задан Matt Hamilton 6 February 2009 в 11:25
поделиться

7 ответов

The null "item" is not being selected by the keyboard at all - rather the previous item is being unselected and no subsequent item is (able to be) selected. This is why, after "selecting" the null item with the keyboard, you are thereafter unable to re-select the previously selected item ("Hello") - except via the mouse!

In short, you can neither select nor deselect a null item in a ComboBox. When you think you are doing so, you are rather deselecting or selecting the previous or a new item.

This can perhaps best be seen by adding a background to the items in the ComboBox. You will notice the colored background in the ComboBox when you select "Hello", but when you deselect it via the keyboard, the background color disappears. We know this is not the null item, because the null item actually has the background color when we drop the list down via the mouse!

The following XAML, modified from that in the original question, will put a LightBlue background behind the items so you can see this behavior.

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <ComboBox x:Name="bars" Height="21" SelectedItem="{Binding Bar}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="LightBlue" Width="200" Height="20">
                        <TextBlock Text="{Binding Name}" />
                    </Grid>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </StackPanel>
</Window>

If you want further validation, you can handle the SelectionChanged event on the ComboBox and see that "selecting the null item" actually gives an empty array of AddedItems in its SelectionChangedEventArgs, and "deselecting the null item by selecting 'Hello' with the mouse" gives an empty array of RemovedItems.

15
ответ дан 26 November 2019 в 23:59
поделиться
0
ответ дан rudigrobler 23 September 2019 в 14:16
поделиться

это не могло бы обратиться к Вашему ответу полностью, но надо надеяться он имеет успех в правильном направлении:

  1. Вы установили SP1?

Из Блога Scott Gu:

  • СЕТЕВЫЕ 3,5 SP1 включает несколько улучшений привязки данных и редактирования
    WPF. Они включают:
  • StringFormat поддерживают в рамках {{Обязательных}} выражений для включения легкого форматирования связанных значений
  • Новая переменная поддержка строк в рамках средств управления, полученных из ItemsControl, который помогает установить переменные свойства на строках (например: чередование цветов фона)
  • Лучшая обработка и преобразование поддерживают для нулевых значений в доступной для редактирования проверке уровня Объекта средств управления, которая применяет правила проверки ко всему связанному объекту
  • поддержка MultiSelector для обработки мультивыбора и объемных сценариев редактирования
  • поддержка IEditableCollectionView, чтобы соединить интерфейсом со средствами управления данными к источникам данных и включить объекты редактирования/добавления/удаления транзакционным способом
  • Повышения производительности при привязке с источниками данных IEnumerable

Жаль, если я потратил впустую время, и это даже не было близко.. но я думаю, что проблема наследована от:

ограничения набора данных со строгим контролем типов

NullValueDataSet, Объясненный здесь

, Но теперь, SP1 для.Net 3.5 должен был решить эту проблему..

1
ответ дан Ric Tokyo 23 September 2019 в 14:16
поделиться

Я знаю, что этот ответ не то, что Вы попросили (объяснение того, почему он не работает с мышью), но я думаю, что предпосылка испорчена:

С моей точки зрения как программист и пользователь (не.NET), выбирая нулевое значение плохая вещь. "пустой указатель", как предполагается, является отсутствием значения, не чего-то, что Вы выбираете.

, Если бы Вам нужна способность явно для не выбора чего-то, я предложил бы любого обходное решение, которое Вы упомянули (" - ", "n.a". или "ни один" как значение), или лучше

  • переносят поле комбинированного списка с флажком, который может быть неконтролируем для отключения поля комбинированного списка. Это кажется мне самым чистым дизайном и с точки зрения пользователя и программно.
5
ответ дан Galghamon 23 September 2019 в 14:16
поделиться

У меня был тот же вид проблемы, мы сделали некоторую работу вокруг подобного добавления свойства значения к объекту набора как это:

 public class Bar

   {
      public string Name { get; set; }
      public Bar Value
      {
         get { return String.IsNullOrEmpty(Name) ?  null :  this; } // you can define here your criteria for being null
      }
   }

Затем при добавлении объектов вместо пустого указателя я использую тот же объект:

  comboBox1.ItemsSource=  new ObservableCollection<Bar> 
        {
            new Bar(),
            new Bar { Name = "Hello" }, 
            new Bar { Name = "World" } 
        };

И вместо selecteditem я связываю его с selectedvalue:

<ComboBox Height="23" Margin="25,40,133,0" DisplayMemberPath="Name"
              SelectedValuePath="Value" 
              SelectedValue="{Binding Bar}"
              Name="comboBox1" VerticalAlignment="Top" />

я знаю, что Это не полное решение, всего одно обходное решение, которое я использую

0
ответ дан Dincer Uyav 23 September 2019 в 14:16
поделиться

Просто предположение, но я думаю, что это звучит разумным.

поле комбинированного списка Assume использует "ListCollectionView" (lcv как его экземпляр) как его набор элементов, которым это должно быть. Если Вы - программист, что Вы собираетесь сделать?

я буду respons и на Клавиатуру и на Мышь.

, После того как я получаю Ввод с клавиатуры, я использую

lcv.MoveCurrentToNext();

или

lcv.MoveCurrentToPrevious();

Так, верная клавиатура работает хорошо.

Затем я работаю над respons исходными данными Мыши. И это прибывает проблема.

  1. я хочу послушать событие 'MouseClick' своего объекта. Но вероятно, мой Объект не делает сгенерированный, это - просто заполнитель. Таким образом, когда пользователь нажимает на этого заполнителя, я ничего не получаю.

  2. , Если я получаю событие успешно, что является следующим. Я вызову

    lcv. MoveCurrentTo (selectedItem);

"selectedItem", который был бы пустым, не является приемлемым параметром здесь, я думаю.

Так или иначе, это просто предполагает. У меня нет времени для отладки в него, хотя я могу. У меня есть набор дефектов для фиксации.Удачи. :)

0
ответ дан redjackwong 23 September 2019 в 14:16
поделиться

ComboBox нужен DataTemplate для отображения объекта, неважно, насколько простой это. DataTemplate работает как это: получите значение от экземпляра. [путь], например,

bar1.Car.Color

, Таким образом, это не может получить значение от

null.Car.Color

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

0
ответ дан redjackwong 23 September 2019 в 14:16
поделиться
Другие вопросы по тегам:

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