我有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。我不喜欢这个解决方案,因为我需要为Page设置两次DataContext,但即使这个解决方案也不起作用:
<Page.BottomAppBar>
<CommandBar IsOpen="True" DataContext="{Binding Source={StaticResource MainPageVm}}">
<AppBarButton Label="Quit" Command={Binding QuitCommand, Mode=TwoWay}"/>
</CommandBar>
</Page.BottomAppBar>
为什么?
答案 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();
}