MVVM Light - 如何从代码隐藏中触发命令

发布于 2024-09-25 02:02:24 字数 376 浏览 2 评论 0原文

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

I need to fire command from WP7 applicationbar. Unfortunately it is not possible, but Laurent published interesting workaround:

private void ApplicationBarMenuItemClick(object sender, System.EventArgs e)
{
  var vm = DataContext as MainViewModel;
  if (vm != null)
     vm.MyCommand.Execute(null);
}

Unfortunately my code behind does not see MainViewModel class or actually any ViewModel class at all! Data binding works well so ViewModel is working fine. What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

兰花执着 2024-10-02 02:02:24

在该行代码上放置一个断点,并检查命中断点时 DataContext 的值。如果它为空,您可能忘记在视图中设置数据上下文。

如果 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

Put a breakpoint on that line of code and check what the value of DataContext is when the breakpoint is hit. If it's null you've probably forgotten to set the data context in your view.

If the DataContext isn't null, make sure it's of type MainViewModel or else the line calling vm.MyCommand.Execute(null) won't ever be called.

Based on the code you pasted, your view should look something like this.

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

This assumes your ViewModelLocator has the property Main of type MainViewModel.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文