AutoCompleteBox и SearchText Очистить - PullRequest
5 голосов
/ 02 февраля 2011

Это не вопрос, а мой ответ на проблему, в которой я не смог найти решения в Интернете.

У меня была проблема с очисткой SearchText в приложении MVVM Silverlight. Я мог очистить очистить SelectedItem и Text, но SearchText остался позади. Он доступен только для чтения и не может быть изменен связыванием.

Пример: AutoCompleteBox со списком стран. Когда пользователь хочет въехать в Австралию, он вводит «au», и в этот момент список распространяется на Австрию и Австралию. Затем пользователь может выбрать Австралию и двигаться дальше. В конце редактирования они нажимают кнопку «Сохранить». В этот момент вполне вероятно, что вы захотите очистить данные для ввода новых данных.

Даже если у вас есть привязки к свойствам SelectedItem и Text и вы установили для них значение 'null' и string.Empty соответственно, свойство SearchText остается, а AutoCompleteBox не очищается, но будет содержать 'au'.

Ответы [ 7 ]

2 голосов
/ 22 мая 2011

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

Я использую шаблонное приложение Silverlight Navigation, которое использует NavigationFrame для загрузки страниц Silverlight. Я заметил, что если я перешел на другую страницу и вернулся к форме данных, SearchText был очищен. Все значения, которые были привязаны к свойствам, оставались действительными, только SearchText очистил все AutoCompleteBoxes. Поэтому я использовал метод PageConductor для внедрения NavigationFrame в ViewModel, где я мог бы вызвать метод refresh. Я получил этот метод из примера Джона Папы из события Silverlight Firestarter, я просто добавил метод Refresh в интерфейс IPageConductor, чтобы теперь я мог вызывать PageConductor.Refresh (), что похоже на перезагрузку страницы. , Я надеюсь, что это поможет кому-то там.

1 голос
/ 27 января 2017

Самый простой способ, который я нашел, это расширить AutoCompleteBox:

public class AutoCompleteBoxClear : AutoCompleteBox
{
    public AutoCompleteBoxClear()
    {
        DataContextChanged += (o, e) =>
        {                
            if (SelectedItem == null)
                Text = string.Empty;
        };
    }
}

Теперь используйте новый элемент управления AutoCompleteBoxClear в вашем XAML.

Это очищает текст только тогда, когда текст автозаполнения dacacontext изменяется на ноль (т. Е. Пользователь нажимает добавить в форму данных.)

Примечание: я думаю, что DataContextChanged доступен только в Silverlight 5, но я предполагаю, что любой, кто все еще использует Silverlight в эти дни, вероятно, обновился бы сейчас ...

1 голос
/ 24 ноября 2011

Необходимо очистить свойство, привязанное к тексту, внутри установленной части свойства 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);
        }
    }

Таким образом, если для свойства SelectedItem задать значение null, для другого свойства будет установлено значение "".

1 голос
/ 29 июня 2011
var t = ProductCombo.ItemsSource;
ProductCombo.ItemsSource = null;
ProductCombo.Text = string.Empty;
ProductCombo.SelectedValue = null;
//ProductCombo.Text = string.Empty;
ProductCombo.ItemsSource = t;

Попробуйте это пожалуйста. У меня сработало

0 голосов
/ 02 июня 2016

Конечно, свойство 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;
0 голосов
/ 15 сентября 2012

У меня недавно была такая же проблема с моим приложением WPF.Я обнаружил, что решение состоит не в том, чтобы установить объект, связанный с SelectedItem, в null, а в его значение по умолчанию.Мне понадобилось время, чтобы понять это.Так что в вашем примере это будет не SelectedCountry = null, а SelectedCountry = new SelectedCountry().В этом случае SearchText очищается также.Посмотрите мое сообщение SO по этому вопросу: Autocompletebox не очищает нажатия клавиш .

0 голосов
/ 03 июля 2011

var t = ProductCombo.ItemsSource;ProductCombo.ItemsSource = null;ProductCombo.Text = string.Empty;ProductCombo.SelectedValue = null;//ProductCombo.Text = string.Empty;ProductCombo.ItemsSource = t;

К сожалению, это код, и мне нужно решение MVVM.

...