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;
Другие вопросы по тегам