2013-04-22 2 views
4

У меня есть Datagrid, и при двойном щелчке по выбранной строке запускается экран редактирования. На этом экране редактирования есть combobox, значение которого привязано к выбранной строке в сетке. Иногда значение, присвоенное combobox, не существует в элементе combobox itemSource, поэтому отображение в combobox пуст, но значение не равно null. Как я могу обновить значение выбранного элемента, чтобы оно было пустым, если значение не существует в коллекции itemsource.Combobox присваивает значение null, если значение не существует в itemsource

В приведенном выше сценарии Так, второй экран привязан к выбранному пункту на первом скрине, то SelectedValue для города является «Лос-Анджелес» и дисплей пуст. Но поскольку в коллекции «Лос-Анджелес» не существует, SelectedValue должен быть нулевым.

+0

Вы пробовали использовать конвертер? –

+0

Не пробовал. Что должен сделать конвертер? – xaria

ответ

0

Преобразователи используются для перевода данных в привязку к желаемому результату. (Разрешить сопоставление несовместимых типов между источником и целью).

Аналогичный вопрос на преобразователе используется между списком и ItemSource находится здесь:

Use converter on bound items in combobox

и вы можете прочитать больше Aboud преобразователей вообще здесь:

http://wpftutorial.net/ValueConverters.html

В этом случае конвертер должен быть помещен в свойство selectedItem комбо.

EDIT:

Я играл немного с образцом кода и registeed для выбора измененного события в поле со списком. это событие запускается только в том случае, если источник для элемента выбора дает выбор, который действителен для поля со списком. Итак, теперь я возвращаюсь к своему первоначальному предложению, которое должно работать: В конвертере проверьте входящее значение на список всех значений элементов списка со списком. Если он не существует, конвертер должен сообщить комбо, что он должен установить свой выбранный элемент равным null. Хотя я уверен, что есть более простые и элегантные способы сделать это (я не эксперт WPF), это должно сделать трюк.

Другой свинец о том, как подключить преобразователь с контролем использует MultiBinding:

Can a WPF converter access the control to which it is bound?

+0

Я не вижу, как здесь может помочь ValueConverter. Не могли бы вы его немного доработать? – DHN

+0

Я не думаю, что конвертер будет работать здесь. Я хочу, чтобы выбранное значение было равно null, если оно не существует в itemsSource Collection – xaria

+0

Возможно, я неправильно понял ваш вопрос. но если вы привязываете выбранный элемент, вы можете использовать преобразователь, чтобы проверить, присутствует ли новое входящее значение в текущих значениях элемента управления. если это так - используйте его. иначе - установите значение null. –

1

Решение состоит в том, чтобы установить ItemsSource из выпадающего списка в списке (пример: «DeviceNameList») и установите SelectedItem этой выпадающей строки в переменную, которая соответствует типу элементов внутри вашего списка (SelectedDeviceName).

Теперь, когда вы загружаете экран редактирования, он привяжет список к выпадающему списку и отобразит заданную вами переменную.

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

Пример:

XAML код:

<ComboBox ItemsSource="{Binding Path=DeviceNameList}" SelectedItem="{Binding Path=SelectedDeviceName}" /> 

Код для установки SelectedItem:

/// <summary> 
    /// Gets or sets SelectedDeviceName. 
    /// </summary> 
    public ObservableCollection<string> DeviceNameList 
    { 
     get 
     { 
      return mDeviceNameList; 
     } 

     set 
     { 
      mDeviceNameList = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets SelectedDeviceName. 
    /// </summary> 
    public string SelectedDeviceName 
    { 
     get 
     { 
      return mSelectedDeviceName; 
     } 

     set 
     { 
      mSelectedDeviceName = value; 
      NotifyPropertyChanged("SelectedDeviceName"); 
     } 
    } 

    /// <summary> 
    /// Event PropertyChanged 
    /// </summary> 
    public event PropertyChangedEventHandler PropertyChanged; 


     /// <summary> 
    /// Function NotifyPropertyChanged 
    /// </summary> 
    /// <param name="property"> 
    /// The property. 
    /// </param> 
    private void NotifyPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 
+0

Энрико, спасибо, но эта часть я уже понял. Я хочу, чтобы часть, где я могу проверить, существует ли выбранное значениеValue в коллекции. – xaria

+0

Я бы предложил что-то вроде * foreach *, чтобы пройти через список, а затем, когда текущий элемент не соответствует чему-то в списке, вы присваиваете ему нуль? – Enrico

Смежные вопросы