如何为所有页面或 AppBarButton 设置 DataContext

How to set DataContext for all Page or for AppBarButton

我的 XAML 页面如下所示:

<Page
  xmlns:vm="using:domain.viewmodels">

  <Page.Resources>
    <vm:MainPageViewModel x:Name="MainPageVm"/>
  </Page.Resources>

  <Grid DataContext="{Binding Source={StaticResource MainPageVm}}">
     <Button Command={Binding QuitCommand, Mode=TwoWay}"/>
  </Grid>

  <Page.BottomAppBar>
    <CommandBar IsOpen="True">
      <AppBarButton Label="Quit"  Command={Binding QuitCommand, Mode=TwoWay}"/>
    </CommandBar>
  </Page.BottomAppBar>

</Page>

我明白了,原因是我只为 Grid 设置了 DataContext,而没有为 BottomAppBar 设置。但是我不知道如何为所有页面设置DataContext。

我试过这段代码,但它不起作用,因为我在下面声明了 MainPageVm:

<Page
  DataContext="{Binding Source={StaticResource MainPageVm}}"
  xmlns:vm="using:domain.viewmodels">

  <Page.Resources>
    <vm:MainPageViewModel x:Name="MainPageVm"/>
  </Page.Resources>

我以为我可以为 CommandBar 设置 DataContext。我不喜欢这个解决方案,因为我需要为页面设置两次 DataContext,但即使这个解决方案也不起作用:

  <Page.BottomAppBar>
    <CommandBar IsOpen="True" DataContext="{Binding Source={StaticResource MainPageVm}}">
      <AppBarButton Label="Quit"  Command={Binding QuitCommand, Mode=TwoWay}"/>
    </CommandBar>
  </Page.BottomAppBar>

为什么?

在代码隐藏中声明 DataContext 通常更简单:

public YourPageClass()
{
     InitializeComponent();
     this.DataContext = new MainPageVM();
}

不使用Resources,而是直接设置DataContext

<Page
  xmlns:vm="using:domain.viewmodels">
  <Page.DataContext>
    <vm:MainPageViewModel x:Name="MainPageVm"/>
  </Page.DataContext>

您的绑定将变为:

<Grid>
     <Button Command={Binding QuitCommand}"/>
  </Grid>

  <Page.BottomAppBar>
    <CommandBar IsOpen="True">
      <AppBarButton Label="Quit"  Command={Binding QuitCommand}"/>
    </CommandBar>
  </Page.BottomAppBar>