В настоящее время я разрабатываю приложение 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 непосредственно к элементу управления, который он мог бы запустить, но я хочу, чтобы команда вызывалась. Код для двух событий более или менее одинаковый, поэтому я не могу понять, почему он называется, а не другой.
Вместо вызова команды в событии TextChanged вы можете связать свойство строки Query в режиме ViewModel в режиме TwoWay, а в настройщике свойства Query вы можете обновить предложение ObservableCollection. Это будет лучший подход к MVVM. – artfuldev