MVVM Light - 如何从代码后面发出命令

时间:2010-09-27 13:10:06

标签: windows-phone-7 mvvm-light

我需要从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工作正常。我做错了什么?

1 个答案:

答案 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