在Page.BottomAppBar中的CommandBar中对AppBarButton的命令不会触发

时间:2013-11-12 13:56:23

标签: c# mvvm winrt-xaml windows-8.1 commandbar

我正在使用MVVM-Pattern为Windows RT / 8.1开发一个小应用程序。

问题是,单击时,绑定命令(来自ViewModel)到Page.BottomAppBar中CommandBar中的AppBarButton不会触发。如果我将DataContext设置为Page.BottomAppBar中CommandBar中的ViewModel,它也不起作用。

如果我将没有Page.BottomAppBar的CommandBar-Code移动到网格中,该命令工作正常,但应用程序不再检测到背景上的点击,这意味着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:将命令绑定到BottomAppBar中的AppBarButton(这不起作用;单击时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中Command的替代绑定(这样可行,但应用程序不再检测背景上的点击)

<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中设置了一个破解点来检查应用程序是否中断。显然,它似乎根本不承认绑定。

另一个奇怪的事情是,当我右键单击AppBarButton中Command Binding中的“RefreshCommand”并单击“Go To Definition”时,Visual Studio会立即将我重定向到ViewModel中的RefreshCommand方法。

1 个答案:

答案 0 :(得分:0)

我解决了问题:

我所要做的就是:将ViewModel放入App.xaml Resources,而不是放入Page Resources:

App.xaml Application.Resources

<Application.Resources>
    <ResourceDictionary>
        <vm:WorkListViewModel x:Key="workVM" />
    </ResourceDictionary>
</Application.Resources>

并将其直接绑定到WorkListView页面并删除Grid中的绑定:

WorkListView.xaml

DataContext="{StaticResource workVM}"´

之前两个绑定之间可能存在冲突。