我在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”
结果:
中不存在名称“EventToCommand”
任何人遇到类似的问题或有什么可能导致这个问题?
答案 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
。
(我的添加引用对话框可能因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>