При связывании данных ComboBox.ItemsSource и SelectedItem результат SelectedItem устанавливается слишком рано - PullRequest
0 голосов
/ 11 ноября 2011

У меня странная проблема с WPF, которую я впервые заметил в компоненте Developer Express (проблема при http://www.devexpress.com/Support/Center/p/Q352950.aspx).

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

Копирование из экспресс-выпуска разработчика (с некоторыми изменениями для ясности):

В моем XAML есть следующий комбобоксит:

<dxe:ComboBoxEdit Name="CharacteristicDropdown" ItemsSource="{Binding Path=Characteristics}" SelectedItem="{Binding Path=StratifyCharacteristic}" ValueMember="CharacteristicName" DisplayMember="CharacteristicName" />

(Примечание -та же проблема, очевидно, существует из-за обычного ComboBox, поэтому я просто сохранил здесь код)

Моя проблема в том, что SelectedItem устанавливается гораздо раньше, чем я ожидаю. Когда изменяется ItemsSource, первый элемент в нем становитсяSelectedItem. Это крайне нелогично - оно НЕ выбрано, просто потому, что оно теперь находится в списке. Более того, оно не фактически визуально выбрано в выпадающем списке. Я хочу, чтобы SelectedItem был установлен, когда я фактически выбралэлемент, через код или взаимодействие с пользовательским интерфейсом, а не только когда я изменяю ItemsSource.

Просто чтобы быть полностью понятным, это цепочка дажеts:

1) У меня есть привязка данных Grid к BindingList элементов

2) У меня есть база данных ComboBox для того же BindingList, что и для сетки

3) Я используюСетка, чтобы добавить что-то в этот список.(Это срабатывает даже до того, как элемент полностью заполнен в сетке, однако это не имеет значения.)

4) SelectedItem Combobox устанавливается автоматически !Это происходит просто потому, что в списке поддержки для выпадающего списка теперь есть элемент.

Обратите внимание, что я на самом деле ничего не выбрал.Я просто добавил в список поддержки.Однако, просто добавив в список поддержки, у меня теперь есть SelectedItem, хотя визуально элемент не выбран.Кроме того, если я СЕЙЧАС пытаюсь выбрать элемент из выпадающего списка, SelectedItem НЕ устанавливается снова!

Это сводит меня с ума - у кого-нибудь есть решение?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

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

Пара предложений:

1) вместо списка привязок попробуйте использовать коллекцию IEnumerable, например:

private ObservableCollection<Drink> drinks = new ObservableCollection<Drink>();

public IEnumerable<Drink> DrinkCollection
     {
         get { return this.drinks; }
     }

и привязать комбо к свойству.

2) Поэкспериментируйте со свойствами UpdateSourceTrigger и SynchronizeWithCurrentItem в xaml.

3) создайте отдельное свойство для вашего комбо.

0 голосов
/ 11 ноября 2011

Я бы посоветовал вам перейти на использование ICollectionView:

Заменить ваше общедоступное свойство новым:

public ViewModel()
{
    this.CharacteristicsView = CollectionViewSource.GetDefaultView(this.Characteristics);
}

public ICollectionView CharacteristicsView { get; private set; }

Измените привязку, чтобы указать новое свойство, иустановите IsSynchronizedWithCurrentItem в true:

<ComboBox ItemsSource="{Binding Path=CharacteristicsView}" 
        IsSynchronizedWithCurrentItem="True" ValueMember="CharacteristicName"
        DisplayMember="CharacteristicName" />

Везде, где вам нужен доступ к текущему элементу, используйте свойство CurrentItem представления:

var currentItem = this.CharacteristicsView.CurrentItem;
...