MVVM Light - как запустить команду из кода позади - PullRequest
2 голосов
/ 27 сентября 2010

Мне нужно запустить команду из панели приложений WP7.К сожалению, это невозможно, но Лоран опубликовал интересный обходной путь:

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 голосов
/ 28 сентября 2010

Поместите точку останова в эту строку кода и проверьте значение DataContext при достижении точки останова. Если он нулевой, вы, вероятно, забыли установить контекст данных в своем представлении.

Если DataContext не является нулевым, убедитесь, что он имеет тип 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 имеет свойство Main типа MainViewModel .

...