MvvmLight EventToCommand不再工作了

时间:2013-10-30 08:54:23

标签: c# xaml mvvm windows-phone-8 mvvm-light

我在Windows Phone 8项目中使用GalaSoft - MVVM Light Toolkit遇到了一个相当奇怪的问题。 突然(在合并一些东西之后)我的所有EventToCommand调用都不再起作用了。他们以前工作过。我已经尝试删除MvvmLight工具包并使用Nuget再次引用它,但结果保持不变。

一个例子:

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
  }

之前完美无缺,但现在BackKeyPress(Object o)方法再也不会被调用了。 所有EventToComamnd调用都会发生这种情况。

如果我删除xmlns标签,Resharper建议添加:

  

的xmlns:命令= “http://www.galasoft.ch/mvvmlight”

结果:

  

名称空间“http://www.galasoft.ch/mvvmlight

中不存在名称“EventToCommand”

任何人遇到类似的问题或有什么可能导致这个问题?

2 个答案:

答案 0 :(得分:2)

这些名称空间是正确的。

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

但是你的PhoneApplicationPage有错误的DataContext。

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

MainMenuViewModel是ViewModelLocator中的属性:

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

Btw BackKeyPress的参数是CancelEventArgs。你应该使用:

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

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

private void BackKeyPress(CancelEventArgs e)
{
}

答案 1 :(得分:1)

Windows Phone 8.1

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

微软开发了自己的EventToCommand功能。它位于Behaviors SDK中。 stackoverflow上的某个人告诉他们通过Nuget获取此SDK。如果您无法在NuGet中找到该包,请在Add reference dialog

中获取

enter image description here (我的添加引用对话框可能因Productivity Power Tools扩展名)

而与原始对话框不同

以下是简单用法的示例:

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