Команда 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}"´

Вероятно, раньше был конфликт между двумя привязками.

Другие вопросы по тегам