Florian Baierl
Florian Baierl

Reputation: 2481

MvvmLight EventToCommand not working anymore

I have encountered a rather strange problem using the GalaSoft - MVVM Light Toolkit in a Windows Phone 8 project. Suddenly (after merging some stuff) all my EventToCommand calls are not working anymore. They worked before. I already tried to remove the MvvmLight toolkit and reference it again with Nuget, but the result stays the same.

One example:

MainMenuPage.xaml

<phone:PhoneApplicationPage 
       ...
       xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
       xmlns:commands="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP8"
       ....>

 <phone:PhoneApplicationPage.DataContext >  
    <Binding Source="{StaticResource MainMenuViewModel}"/>
 </phone:PhoneApplicationPage.DataContext>


 <!-- catch back key press -->
 <i:Interaction.Triggers>
    <i:EventTrigger EventName="BackKeyPress">
        <commands:EventToCommand 
            Command="{Binding BackKeyPressCommand}"
            PassEventArgsToCommand="True"/>
    </i:EventTrigger>
 </i:Interaction.Triggers>

MainMenuViewModel.cs

 // back key press command
 public RelayCommand<object> BackKeyPressCommand { get; set; }

 public MainMenuViewModel()
 {
       BackKeyPressCommand = new RelayCommand<object>(
           BackKeyPress,
           (o) => true
           );

       ...
  }

  private void BackKeyPress(Object o)
  {
        // handle back key press
  }

This worked perfectly before, but now the BackKeyPress(Object o) Method never gets called anymore. This happens for all EventToComamnd calls.

If I remove the xmlns tags, Resharper suggests to add this:

xmlns:command="http://www.galasoft.ch/mvvmlight"

Result of that:

The name "EventToCommand" does not exist in the namespace "http://www.galasoft.ch/mvvmlight"

Anyone encountered a similar problem or has an idea what could have caused this?

Upvotes: 2

Views: 2852

Answers (2)

opewix
opewix

Reputation: 5083

Windows Phone 8.1

Windows 8.1 Behavior SDK: How to use InvokeAction with InputConverter to pass arguments to a Command

Microsoft has developed it's own EventToCommand functionality. It's located in Behaviors SDK. Someone on stackoverflow told to get this SDK via Nuget. If you can't find the package in NuGet - get it in Add reference dialog.

enter image description here (My add reference dialog may differs from original because of Productivity Power Tools extension)

Here is example of simple usage:

<ListBox ItemsSource="{Binding Persons, Mode=OneWay}" 
         SelectedItem="{Binding SelectedPerson, Mode=TwoWay}">
    <interactivity:Interaction.Behaviors>
        <core:EventTriggerBehavior EventName="SelectionChanged">
            <core:InvokeCommandAction Command="{Binding DisplayPersonCommand}" />
        </core:EventTriggerBehavior>
    </interactivity:Interaction.Behaviors>
</ListBox>

Upvotes: 1

Jakub Krampl
Jakub Krampl

Reputation: 1794

These namespaces are correct.

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:commands="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP8"

But your PhoneApplicationPage has wrong DataContext.

DataContext="{Binding Path=MainMenuViewModel, Source={StaticResource Locator}}"

MainMenuViewModel is property in the ViewModelLocator:

public MainMenuViewModel MainMenuViewModel
{
    get
    {
        return ServiceLocator.Current.GetInstance<MainMenuViewModel>();
    }
}

Btw the argument of BackKeyPress is CancelEventArgs. You should use:

public RelayCommand<CancelEventArgs> BackKeyPressCommand { get; private set; }

this.BackKeyPressCommand = new RelayCommand<CancelEventArgs>(this.BackKeyPress)

private void BackKeyPress(CancelEventArgs e)
{
}

Upvotes: 2

Related Questions