我需要从WP7应用程序栏中激活命令。不幸的是,这是不可能的,但Laurent发布了有趣的解决方法:
private void ApplicationBarMenuItemClick(object sender, System.EventArgs e)
{
var vm = DataContext as MainViewModel;
if (vm != null)
vm.MyCommand.Execute(null);
}
不幸的是,我背后的代码根本看不到MainViewModel
类或实际上任何ViewModel
类!数据绑定效果很好,ViewModel
工作正常。我做错了什么?
答案 0 :(得分:0)
在该行代码上放置一个断点,并在遇到断点时检查 DataContext 的值。如果它为null,您可能忘记在视图中设置数据上下文。
如果DataContext不为null,请确保它的类型为MainViewModel,否则将不会调用调用vm.MyCommand.Execute(null)的行。
根据您粘贴的代码,您的视图应如下所示。
<phone:PhoneApplicationPage x:Class="MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
shell:SystemTray.IsVisible="True"
DataContext="{Binding Path=Main, Source={StaticResource Locator}}"
>
<Grid x:Name="LayoutRoot" Background="Transparent">
<!-- the rest has been ommitted for simplicity -->
</Grid>
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem x:Name="appBarMenuItem1" Click="ApplicationBarMenuItemClick" Text="Menu Item 1" />
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
</phone:PhoneApplicationPage>
这假设您的 ViewModelLocator 具有 MainViewModel 类型的属性 Main 。