2011-02-02 10 views
5

To nie jest pytanie, ale moja odpowiedź na problem, którego nie mogłem znaleźć w internecie.AutoCompleteBox i SearchText Clear

Wystąpił problem podczas usuwania SearchText w aplikacji MVVM Silverlight. Mogłem wyczyścić SelectedItem i Text, ale SearchText został pozostawiony. Jest to tylko do odczytu i nie można go zmienić przez powiązanie.

Przykład: AutoCompleteBox z listą krajów. Gdy użytkownik chce wejść do Australii, wpisuje "au" w tym miejscu lista aprobuje z Austrią i Australią. Użytkownik może następnie wybrać Australię i przejść dalej. Po zakończeniu edycji klikają przycisk "Zapisz". W tym momencie prawdopodobnie będziesz chciał wyczyścić dane w celu wprowadzenia nowych danych.

Nawet jeśli masz powiązania z właściwości SelectedItem i tekstem, a następnie ustawiasz je na 'null' i string.Empty odpowiednio właściwość SearchText pozostaje i AutoCompleteBox nie zostanie wyczyszczone, ale będzie zawierało 'au'.

Odpowiedz

2

Pisałem o tym w całym Internecie, ale nie mogłem uzyskać odpowiedzi na temat samej kontroli, więc przyszedłem pod nią pod innym kątem, co może pomóc komuś, kto doznaje frustracji jak ja.

Używam aplikacji szablonu Nawigacja Silverlight, która korzysta ze strony NavigationFrame, w której ładuje strony Silverlight. Zauważyłem, że gdy przejdę na inną stronę i wróciłem do mojego formularza danych, wyszukiwany tekst został wyczyszczony. Wszelkie wartości, które zostały powiązane z właściwościami, pozostały prawidłowe, tylko wyszukiwany tekst został wyczyszczony we wszystkich elementach AutoCompleteBox. Dlatego użyłem metody PageConductor do wstrzyknięcia elementu NavigationFrame do narzędzia ViewModel, w którym mogłem wywołać metodę odświeżania. Dostałem tę metodę od John Papa's example ze zdarzenia FireWarter Silverlight, po prostu dodałem metodę Odśwież do interfejsu IPageConductor, więc jestem teraz w stanie wywołać "PageConductor.Refresh()", który jest jak ponowne ładowanie strony. Mam nadzieję, że to pomoże komuś tam.

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

Spróbuj please.it pracował dla mnie

0

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

Niespodziewanie jest to niedozwolone z powodu kodu i potrzebowałem rozwiązania MVVM.

1

należy usunąć właściwość bindeaded aby ustawić tekst wewnątrz część selectedItem zbindowanych własności, podobnie jak to:

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); 
     } 
    } 

Więc, kiedy ustawić zerowy rzeczowe selectedItem, druga właściwość zostanie ustawiony na „”.

0

Niedawno miałem ten sam problem z moją aplikacją WPF. Okazało się, że rozwiązaniem nie jest ustawienie obiektu związanego z SelectedItem na wartość null, ale na jego domyślną wartość. Zajęło mi trochę czasu, aby to rozgryźć. W twoim przykładzie nie będzie to SelectedCountry = null, ale SelectedCountry = new SelectedCountry(). W tym przypadku tekst wyszukiwania również zostanie wyczyszczony. Sprawdź mój wpis SO dotyczący tej sprawy: Autocompletebox doesn't clear keyboard strokes.

nieruchomość
-1

Jasne SearchText jest tylko do odczytu, ale możemy dostać składnik podrzędny AutoCompleteBox:

var searchText = autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text"); 

A teraz możemy zresetować SearchText poprzez właściwości Text TextBox składnika:

if (searchText != null) searchText.Text = string.Empty; 

W języku C# 6.0 jest on bardziej lakoniczny:

autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text")?.Text = string.Empty; 
+0

Zwykle pomaga trochę wyjaśnień z fragmentem kodu. – hardillb

1

Najprostszym sposobem, jaki znalazłem, jest rozszerzenie AutoCompleteBox:

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

Teraz użyć nowego kontrolę AutoCompleteBoxClear w XAML. (Tj. Użytkownik kliknie dodać w DataForm)

ta kasuje tekst tylko wtedy, gdy zmiany autocompletebox DataContext NULL

Uwaga: Myślę DataContextChanged jest dostępna tylko w Silverlight 5, ale ja myślę, że ktoś jeszcze korzystanie z Silverlight prawdopodobnie zostało zaktualizowane do tej pory ...

Powiązane problemy