2013-11-20 15 views
5

Chúng tôi đang viết một ứng dụng Windows 8.1 Store sử dụng điều khiển SearchBox XAML mới. Có vẻ như cách duy nhất để đưa đề xuất vào danh sách thả xuống khi loại người dùng sử dụng SearchBoxSuggestionsRequestedEventArgs và nhận SearchSuggestionCollection từ sự kiện rồi thêm các đề xuất vào đó.Win 8.1 Hộp tìm kiếm - gợi ý ràng buộc

Chúng tôi đang sử dụng Prism cho WinRT và muốn tách Hộp tìm kiếm và các sự kiện của nó khỏi ViewModel đang nhận danh sách các chuỗi gợi ý.

Tôi không thể tìm thấy việc gắn kết danh sách chuỗi với SearchSuggestionCollection hoặc bất kỳ cách nào để thêm chúng theo chương trình mà không liên quan đến việc sử dụng sự kiện args, điều này làm cho việc kiểm tra đơn vị trở nên rất phức tạp.

Có cách nào để ràng buộc/thêm các đề xuất không liên quan đến sự kiện không?

+0

Im trên điện thoại của tôi bị bệnh thêm này như là một bình luận thay vì trả lời. Hãy xem EventToCommand trong MVVM Light. Đó là những gì tôi đã làm trong một tình huống tương tự. bị bệnh lấy máy tính của tôi và đặt cùng một ví dụ sau, nhưng trong trường hợp bạn đang ở trong một vội vàng này nên cung cấp cho bạn một khởi đầu. –

+0

Bạn đã làm cho nó được sắp xếp? –

Trả lời

8

Được rồi, vì vậy tôi bị ám ảnh bởi câu hỏi này và đây là giải pháp cho khi sử dụng Hộp tìm kiếm. Tôi đã tải lên một mẫu đầy đủ trên MSDNGitHub

Tóm lại, sử dụng SDK hành vi và InvokeCommand, sau đó sử dụng trình chuyển đổi để lấy bất kỳ dữ liệu nào bạn cần bằng cách sử dụng các thuộc tính mới InputConvert và InputConverterParameter.

XAML:

<SearchBox SearchHistoryEnabled="False" x:Name="SearchBox" Width="500" Height="50"> 
     <SearchBox.Resources> 
      <local:SearchArgsConverter x:Name="ArgsConverter"/> 
     </SearchBox.Resources> 
     <interactivity:Interaction.Behaviors> 
      <core:EventTriggerBehavior EventName="SuggestionsRequested"> 
       <core:InvokeCommandAction 
        Command="{Binding SuggestionRequest}" 
        InputConverter="{StaticResource ArgsConverter}" 
        InputConverterLanguage="en-US" 
        InputConverterParameter="{Binding ElementName=SearchBox, Path=SearchHistoryEnabled}"/> 
      </core:EventTriggerBehavior> 
     </interactivity:Interaction.Behaviors> 
    </SearchBox> 

Chuyển đổi:

public sealed class SearchArgsConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     var args = (SearchBoxSuggestionsRequestedEventArgs)value; 
     var displayHistory = (bool)parameter; 

     if (args == null) return value; 
     ISuggestionQuery item = new SuggestionQuery(args.Request, args.QueryText) 
     { 
      DisplayHistory = displayHistory 
     }; 
     return item; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return value; 
    } 
} 

Mainpade codebehind - tất nhiên bạn muốn điều này trong một VM :)

public sealed partial class MainPage 
{ 
    public DelegateCommand<string> Search { get; set; } 
    public DelegateCommand<ISuggestionQuery> SuggestionRequest { get; set; } 

    public MainPage() 
    { 
     InitializeComponent(); 
     Search = new DelegateCommand<string>(SearchedFor, o => true); 
     SuggestionRequest = new DelegateCommand<ISuggestionQuery>(SuggestionRequestFor, o => true); 

     DataContext = this; 
    } 

    private void SuggestionRequestFor(ISuggestionQuery query) 
    { 
     IEnumerable<string> filteredQuery = _data 
      .Where(suggestion => suggestion.StartsWith(query.QueryText, 
       StringComparison.CurrentCultureIgnoreCase)); 
     query.Request.SearchSuggestionCollection.AppendQuerySuggestions(filteredQuery); 
    } 

    private readonly string[] _data = { "Banana", "Apple", "Meat", "Ham" }; 

    private void SearchedFor(string queryText) 
    { 
    } 
} 

Tôi đã viết lên một bước đi đầy đủ thông qua trên blog của tôi, nhưng ở trên là tất cả những gì bạn thực sự cần :)

+0

Không muốn liên kết đến blog của tôi trong câu trả lời vì một số người không thích điều đó, nhưng đây là bước đi qua: http://irisclasson.com/2013/12/10/passing-event-arguments-from- xaml-in-windows-store-apps-inputconverter-inputconverterparameter-etc / –

Các vấn đề liên quan