如何为所有页面或 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>
- 如果我按下按钮 – 命令被执行。
- 如果我按下 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。我不喜欢这个解决方案,因为我需要为页面设置两次 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>
我的 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。我不喜欢这个解决方案,因为我需要为页面设置两次 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>