2015-08-13 3 views
2

В настоящее время я разрабатываю приложение UWP.UWP EventTriggerBehaviour command не называется

У меня есть элемент управления AutoSuggestBox, и я хочу обрабатывать некоторые его события с помощью команд (поскольку я следую за шаблоном MVVM). Для этого я ссылаюсь на Microsoft.Xaml.Interactivity (из Blend).

код я использую как таковой:

 <AutoSuggestBox x:Name="autoSuggestBox" 
          Width="256" 
          HorizontalAlignment="Right" 
          ItemsSource="{Binding SearchResults}" 
          MaxSuggestionListHeight="256" 
          QueryIcon="Find"> 
       <i:Interaction.Behaviors> 
        <core:EventTriggerBehavior EventName="SuggestionChosen"> 
         <core:InvokeCommandAction Command="{Binding SuggestionChosenCommand}" CommandParameter="{Binding ElementName=autoSuggestBox}" /> 
        </core:EventTriggerBehavior> 
        <core:EventTriggerBehavior EventName="TextChanged"> 
         <core:InvokeCommandAction Command="{Binding ChangeSearchResultsCommand}" CommandParameter="{Binding Text, ElementName=autoSuggestBox}" /> 
        </core:EventTriggerBehavior> 
       </i:Interaction.Behaviors> 
       <AutoSuggestBox.ItemTemplate> 
        ... 
       </AutoSuggestBox.ItemTemplate> 
      </AutoSuggestBox> 

И в ViewModel позади я определяю мои команды как таковой:

Command<string> _changeSearchResultsCommand = default(Command<string>); 
    public Command<string> ChangeSearchResultsCommand { get { return _changeSearchResultsCommand ?? (_changeSearchResultsCommand = new Command<string>(async (param) => { await ExecuteChangeSearchResultsCommand(param); }, CanExecuteChangeSearchResultsCommand)); } } 
    private bool CanExecuteChangeSearchResultsCommand(string p) { return !IsSearchBusy; } 
    private async Task ExecuteChangeSearchResultsCommand(string text) 
    { 
     ... 
    } 

    Command<ShowModel> _suggestionChosenCommand = default(Command<ShowModel>); 
    public Command<ShowModel> SuggestionChosenCommand { get { return _suggestionChosenCommand ?? (_suggestionChosenCommand = new Command<ShowModel>(async (param) => { await ExecuteSuggestionChosenCommand(param); }, CanExecuteSuggestionChosenCommand)); } } 
    private bool CanExecuteSuggestionChosenCommand(ShowModel p) { return true; } 
    public async Task ExecuteSuggestionChosenCommand(ShowModel show) 
    { 
     ... 
    } 

И SearchResults определяется следующим образом:

private ObservableCollection<ShowModel> _searchResults = default(ObservableCollection<ShowModel>); 
    public ObservableCollection<ShowModel> SearchResults { get { return _searchResults; } set { Set(ref _searchResults, value); } } 

Моя проблема заключается в том, что событие TextChanged отлично работает. Команда вызывается всякий раз, когда происходит событие. Однако событие SuggestionChosen никогда не запускает команду. Если бы я должен был приложить событие SuggestionChosen непосредственно к элементу управления, который он мог бы запустить, но я хочу, чтобы команда вызывалась. Код для двух событий более или менее одинаковый, поэтому я не могу понять, почему он называется, а не другой.

ответ

3

Мне удалось решить это самостоятельно. Проблема заключалась в привязке события SuggestionChosen. Связывание не возвращало тип значения, ожидаемого командой (ShowModel).

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

+0

Вместо вызова команды в событии TextChanged вы можете связать свойство строки Query в режиме ViewModel в режиме TwoWay, а в настройщике свойства Query вы можете обновить предложение ObservableCollection. Это будет лучший подход к MVVM. – artfuldev