AutoCompleteBox и SearchText Очистить
Это не вопрос, но мой ответ на проблему, которую я не смог найти в интернете.
У меня была проблема с очисткой SearchText в приложении MVVM Silverlight. Я мог очистить очистить SelectedItem и Text, но SearchText остался позади. Он доступен только для чтения и не может быть изменен связыванием.
Пример: AutoCompleteBox со списком стран. Когда пользователь хочет въехать в Австралию, он вводит "au", и в этот момент список распространяется на Австрию и Австралию. Затем пользователь может выбрать Австралию и двигаться дальше. В конце редактирования они нажимают кнопку "Сохранить". В этот момент вполне вероятно, что вы захотите очистить данные для ввода новых данных.
Даже если у вас есть привязки к свойствам SelectedItem и Text, и вы установили для них значение 'null' и string.Empty, соответственно, свойство SearchText останется, а AutoCompleteBox не очистится, но будет содержать 'au'.
7 ответов
Я писал об этом по всему Интернету, но не мог получить ответ о самом контроле, и поэтому я пришел к этому под другим углом, который может помочь кому-то, кто в конечном итоге разочаровался, как я.
Я использую шаблонное приложение Silverlight Navigation, которое использует NavigationFrame для загрузки страниц Silverlight. Я заметил, что если я перешел на другую страницу и вернулся к форме данных, SearchText был очищен. Все значения, которые были привязаны к свойствам, оставались действительными, только SearchText очистил все AutoCompleteBoxes. Поэтому я использовал метод PageConductor для внедрения NavigationFrame в ViewModel, где я мог бы вызвать метод refresh. Я получил этот метод из примера Джона Папы из события Silverlight Firestarter, я просто добавил метод Refresh в интерфейс IPageConductor, чтобы теперь я мог вызывать PageConductor.Refresh(), что похоже на перезагрузку страницы. Я надеюсь, что это помогает кому-то там.
var t = ProductCombo.ItemsSource;
ProductCombo.ItemsSource = null;
ProductCombo.Text = string.Empty;
ProductCombo.SelectedValue = null;
//ProductCombo.Text = string.Empty;
ProductCombo.ItemsSource = t;
Попробуй это пожалуйста. У меня сработало
Самый простой способ, который я нашел, - это расширить AutoCompleteBox:
public class AutoCompleteBoxClear : AutoCompleteBox
{
public AutoCompleteBoxClear()
{
DataContextChanged += (o, e) =>
{
if (SelectedItem == null)
Text = string.Empty;
};
}
}
Теперь используйте ваш новый элемент управления AutoCompleteBoxClear в вашем XAML.
Это очищает текст, только когда текст автозаполнения dacacontext изменяется на ноль (то есть пользователь нажимает добавить в форму данных.)
Примечание: я думаю, что DataContextChanged доступен только в Silverlight 5, но я предполагаю, что любой, кто все еще использует Silverlight в эти дни, вероятно, обновился бы сейчас...
Вы должны очистить свойство, привязанное к тексту, внутри части набора свойства SelectedItem Binded, например:
public string AnalisisText
{
get { return _analisisText; }
set
{
if (_analisisText == value)
{
return;
}
_analisisText = value;
RaisePropertyChanged(AnalisisTextPropertyName);
}
}
public DatosAutoCompletaPedidosDetalleViewDTO AnalisisSelect
{
get { return _analisisSelect; }
set
{
if (_analisisSelect == value)
{
return;
}
_analisisSelect = value;
if (_analisisSelect == null) AnalisisText = "";
RaisePropertyChanged(AnalisisSelectPropertyName);
}
}
Таким образом, когда вы устанавливаете null для свойства SelectedItem, другое свойство будет иметь значение "".
var t = ProductCombo.ItemsSource; ProductCombo.ItemsSource = null; ProductCombo.Text = string.Empty; ProductCombo.SelectedValue = null; //ProductCombo.Text = string.Empty; ProductCombo.ItemsSource = t;
К сожалению, это кодовый код, и мне нужно решение MVVM.
У меня недавно была такая же проблема с моим приложением WPF. Я обнаружил, что решение состоит не в том, чтобы установить объект, связанный с SelectedItem, в null, а в его значение по умолчанию. Мне понадобилось время, чтобы понять это. Так что в вашем примере это не будет SelectedCountry = null
, но SelectedCountry = new SelectedCountry()
, В этом случае SearchText очищается также. Посмотрите мой SO пост по этому вопросу: Autocompletebox не очищает нажатия клавиш.
Конечно, свойство SearchText доступно только для чтения, но мы можем получить дочерний компонент AutoCompleteBox:
var searchText = autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text");
И теперь мы можем сбросить SearchText через свойство Text компонента TextBox:
if (searchText != null) searchText.Text = string.Empty;
В C# 6.0 это более лаконично:
autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text")?.Text = string.Empty;