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

时间:2015-01-12 19:24:23

标签: xaml windows-8.1

我有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>
  • 如果我按下按钮 - 执行命令。
  • 如果我按下AppBarButton - 命令未执行。

我明白的原因是我只为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。我不喜欢这个解决方案,因为我需要为Page设置两次DataContext,但即使这个解决方案也不起作用:

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

为什么?

2 个答案:

答案 0 :(得分:2)

不使用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>

答案 1 :(得分:1)

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

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