Команда AppBarButton в CommandBar внутри Page.BottomAppBar не запускается
Я работаю над небольшим приложением для Windows RT / 8.1, используя MVVM-Pattern.
Проблема в том, что связанная команда (исходящая из ViewModel) для AppBarButton в CommandBar в Page.BottomAppBar не запускается при нажатии на нее. Это тоже не работает, если я установил DataContext в ViewModel в CommandBar в Page.BottomAppBar.
Если я перемещаю CommandBar-код без Page.BottomAppBar в сетку, команда работает нормально, но приложение больше не обнаруживает нажатия на фон, что означает, что CommandBar не закрывается, когда он должен,
Я думаю, что это как-то связано с DataContext-Binding, но я понятия не имею, как это исправить.
Также нет никаких ошибок или подсказок. Есть ли решение там? Большое вам спасибо!:)
WorkListView.xaml: установить ViewModel
<Page.Resources>
<x:String x:Key="AppName">My Worklist</x:String>
<vm:WorkListViewModel x:Key="viewModel"/>
</Page.Resources>
WorkListView.xaml: установить DataContext для сетки (только для справки)
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" DataContext="{StaticResource viewModel}">
WorkListView.xaml: команда привязки к AppBarButton в BottomAppBar (это не работает; RefreshCommand не запускается при нажатии)
<Page.BottomAppBar>
<CommandBar x:Name="cmdBar" Background="#FF7300">
<AppBarButton Icon="Refresh" Label="Refresh" IsEnabled="True" Command="{Binding RefreshCommand}"/>
</CommandBar>
</Page.BottomAppBar>
WorkListView.xaml: альтернативное связывание команды в сетке (это работает, но приложение больше не обнаруживает нажатия на фон)
<Grid Grid.Row="2">
<CommandBar x:Name="cmdBar" Background="#FF7300">
<AppBarButton Icon="Refresh" Label="Refresh" IsEnabled="True" Command="{Binding RefreshCommand}"/>
</CommandBar>
</Grid>
WorkListViewModel.cs: установка RefreshCommand / Delegate RefreshCommand для OnExecuteRefreshCommand
private DelegateCommand _refreshCommand;
public DelegateCommand RefreshCommand
{
get { return _refreshCommand; }
set { this.SetProperty<DelegateCommand>(ref _refreshCommand, value); }
}
public WorkListViewModel()
{
this.ItemsView = this.CreateCollectionView(_workList);
this.ItemsView.CurrentChanged += this.OnCurrentItemChanged;
this.RefreshCommand = new DelegateCommand(this.OnExecuteRefreshCommand);
}
private async void OnExecuteRefreshCommand(object parameter)
{
ItemsView.Clear();
SetList(await Helpers.WebServiceConnector.refreshWorkList());
}
// РЕДАКТИРОВАТЬ: я уже установил точку останова в OnExecuteRefreshCommand, чтобы проверить, не сломалось ли приложение. Похоже, что он не распознает связывание вообще.
Еще одна странная вещь: когда я щелкаю правой кнопкой мыши "RefreshCommand" в "Привязке команд" в AppBarButton и нажимаю "Перейти к определению", Visual Studio сразу перенаправляет меня в метод RefreshCommand в ViewModel.
1 ответ
Я решил проблему:
Все, что мне нужно было сделать: поместить ViewModel в ресурсы App.xaml, а не в ресурсы страницы:
App.xaml Application.Resources
<Application.Resources>
<ResourceDictionary>
<vm:WorkListViewModel x:Key="workVM" />
</ResourceDictionary>
</Application.Resources>
и связал его непосредственно с страницей WorkListView и удалил привязку в Grid:
WorkListView.xaml
DataContext="{StaticResource workVM}"´
Вероятно, раньше был конфликт между двумя привязками.