2011-02-02 43 views
5

Đây không phải là một câu hỏi nhưng câu trả lời của tôi cho một vấn đề tôi không thể tìm thấy một giải pháp để trên internet.AutoCompleteBox và SearchText Rõ ràng

Tôi gặp sự cố khi xóa SearchText trong ứng dụng MVVM Silverlight. Tôi có thể xóa rõ ràng SelectedItem và Text nhưng SearchText bị bỏ lại phía sau. Nó chỉ đọc và không thể thay đổi bằng cách ràng buộc.

Ví dụ: AutoCompleteBox với danh sách Quốc gia. Khi người dùng muốn nhập Úc, họ nhập 'au' vào thời điểm này, danh sách các ứng viên với Áo và Úc. Sau đó, người dùng có thể chọn Úc và tiếp tục. Khi kết thúc chỉnh sửa, họ nhấp vào nút 'Lưu'. Tại thời điểm này có khả năng bạn sẽ muốn xóa dữ liệu forn để nhập dữ liệu mới.

Thậm chí nếu bạn có liên kết với SelectedItem và thuộc tính Văn bản và bạn đặt chúng thành 'null' và chuỗi.Empty tương ứng, thuộc tính SearchText vẫn còn và AutoCompleteBox sẽ không rõ ràng nhưng sẽ chứa 'au'.

Trả lời

2

Tôi đăng về điều này trên internet nhưng có thể không nhận được câu trả lời về kiểm soát chính nó và vì vậy tôi đã đến nó từ một góc độ khác nhau mà có thể giúp một người kết thúc thất vọng như tôi.

Tôi đang sử dụng ứng dụng mẫu Điều hướng Silverlight sử dụng NavigationFrame để tải các trang Silverlight. Tôi nhận thấy rằng nếu tôi điều hướng đến một trang khác và quay trở lại biểu mẫu dữ liệu thì SearchText đã bị xóa. Bất kỳ giá trị nào bị ràng buộc vào các thuộc tính vẫn hợp lệ, chỉ có SearchText đã xóa trên tất cả các AutoCompleteBox. Do đó, tôi đã sử dụng phương thức PageConductor để tiêm NavigationFrame vào ViewModel nơi tôi có thể gọi phương thức làm mới. Tôi nhận được phương pháp này từ example của John Papa từ sự kiện Silverlight Firestarter, tôi chỉ cần thêm phương thức Làm mới vào giao diện IPageConductor vì vậy bây giờ tôi có thể gọi 'PageConductor.Refresh()' giống như tải lại trang. Tôi hy vọng điều này sẽ giúp ích cho ai đó.

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

Hãy thử please.it này làm việc cho tôi

0

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

Không may mắn thay đây là mã-đằng sau và tôi cần giải pháp MVVM.

1

Bạn phải xóa thuộc tính bindeaded sang Text bên trong thiết lập phần tài sản SelectedItem binded, như thế này:

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

Vì vậy, khi bạn thiết lập null để SelectedItem bất động sản, tài sản khác sẽ thiết lập để "".

0

Gần đây, tôi đã gặp sự cố tương tự với ứng dụng WPF của mình. Tôi phát hiện ra rằng các giải pháp không phải là để thiết lập các đối tượng ràng buộc để SelectedItem null, nhưng để giá trị mặc định của nó. Đã cho tôi một thời gian để tìm ra điều này. Vì vậy, trong ví dụ của bạn, nó sẽ không là SelectedCountry = null, nhưng SelectedCountry = new SelectedCountry(). Trong trường hợp này, SearchText cũng bị xóa. Kiểm tra bài đăng SO của tôi về vấn đề này: Autocompletebox doesn't clear keyboard strokes.

tài sản
-1

chắc searchText là read-only, nhưng chúng tôi có thể nhận được các thành phần con của AutoCompleteBox:

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

Và bây giờ chúng ta có thể thiết lập lại searchText qua thuộc tính Text của TextBox thành phần:

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

Trong C# 6.0 nó có nhiều chi tiết:

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

Một giải thích nhỏ để đi với đoạn mã thường giúp ích. – hardillb

1

Cách dễ nhất tôi tìm thấy là mở rộng hộp AutoCompleteBox:

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

Bây giờ, hãy sử dụng hộp kiểm AutoCompleteBoxXóa mới trong XAML của bạn. (. Tức là người dùng nhấp thêm trong DataForm)

này xóa các văn bản chỉ khi thay đổi autocompletebox DataContext để null

Lưu ý: Tôi nghĩ DataContextChanged chỉ có trong Silverlight 5, nhưng tôi đoán rằng ai vẫn còn sử dụng Silverlight những ngày này có thể sẽ được nâng cấp ngay bây giờ ...