2010-06-23 2 views
2

У меня проблема с AutoCompleteBox. Я хотел использовать его как редактируемый combobox. Поэтому я создал настраиваемый элемент управления, наследующий от AutoCompletBox, и добавил два свойства зависимостей, названных как SelectedValue (для привязки к DataContext) и SelectedValuePath. Когда пользователь выбирает элемент, мои пользовательские контрольные обновления SelectedValue выполняются следующим образом:Silverlight, сбросив AutoCompleteBox.SelectedItem на null

string propertyPath = this.SelectedValuePath; 
PropertyInfo propertyInfo = this.SelectedItem.GetType().GetProperty(propertyPath); 
object propertyValue = propertyInfo.GetValue(this.SelectedItem, null); 
this.SelectedValue = propertyValue; 

Это работает.

С другой стороны, когда базовый datacontext изменен, SelectedValue также изменяется; так SelectedItem пользовательского элемента управления также должен измениться:

if (this.SelectedValue == null) 
{ 
    this.SelectedItem = null; //Here's the problem!!! 
} 
else 
{ 
    object selectedValue = this.SelectedValue; 
    string propertyPath = this.SelectedValuePath; 
    if (selectedValue != null && !(string.IsNullOrEmpty(propertyPath))) 
    { 
     foreach (object item in this.ItemsSource) 
     { 
     PropertyInfo propertyInfo = item.GetType().GetProperty(propertyPath); 
     if (propertyInfo.GetValue(item, null).Equals(selectedValue)) 
      this.SelectedItem = item; 
     } 
    } 
} 

Что меня беспокоит, когда SelectedValue равна нулю. Даже если для параметра SelectedItem установлено значение null, свойство Text не очищается, если оно было отредактировано пользователем вручную. Поэтому SelectedItem = null, но AutoCompleteBox отображает текст, введенный вручную. Может ли кто-нибудь показать мне правильный способ сброса свойства AutoCompleteBox.SelectedItem?

+0

На самом деле, приведенный выше код - из автозаполненияComboBox; см.: http://www.codeproject.com/KB/silverlight/AutoComplete_ComboBox.aspx – synergetic

ответ

2

Какое совпадение ... Сегодня я делал то же самое. На самом деле даже не утруждайте установкой SelectedItem = null. Вы можете просто установить Text = String.Empty, и как текстовая область, так и SelectedItem будут очищены.

+0

Спасибо, Джош, вы действительно спасли мой день. – synergetic

+0

Рад это услышать. Дайте мне знать, если вы найдете способ использования IsTextCompletionEnabled = True * и * показать все элементы в раскрывающемся списке при открытии поля со списком. Это то, что выгнало меня со скалы сегодня. – Josh

+0

Кроме того, одна вещь, которая действительно помогла мне обернуть голову различными свойствами AutoCompleteBox и как они ведут себя под разными настройками, - это установить три ярлыка рядом с полем. Привяжите одно к SelectedItem, одно к тексту и одно к SearchText. Интересно посмотреть, как/когда значения изменяются при наборе текста, выборе из раскрывающегося списка и т. Д. – Josh

2

Это не работает в MVVM создан

+0

У меня такая же проблема. Как заставить его работать в MVVM? –

-1

Это решает проблему:

selectedChange += (e,v) => {if (selected item == null) Text = String.Empty}; 

но Каус к другой проблеме - при выборе пункта и вставить позже ...

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