我的问题是为什么我在使用交互触发器时看到一些意外行为,而不是在使用普通点击事件时。
在我的 WP7 应用程序中,我有一个带有三个枢轴项的枢轴控件。在第一个枢轴项目上有一个按钮,它执行某些操作,然后需要设置当前枢轴项目以显示最后一个。我在其他工具中使用 MVVM 和 Prism。
因此,视图是:
<controls:Pivot Name="myPivot" SelectedIndex="{Binding Path=PivotIndex, Mode=TwoWay}">
<controls:PivotItem Header="first">
<Button Content="Search">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding myViewModel.SearchCommand, Source={StaticResource ViewModelLocator}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</controls:PivotItem>
<controls:PivotItem Header="second"></controls:PivotItem>
<controls:PivotItem Header="third"></controls:PivotItem>
</controls:Pivot>
ViewModel 是这样的:
public class myViewModel : NotificationObject
{
private int mPivotIndex;
public int PivotIndex
{
get { return mPivotIndex; }
set
{
mPivotIndex = value;
RaisePropertyChanged(() => this.PivotIndex);
}
}
public DelegateCommand SearchCommand { get; set; }
public myViewModel()
{
this.SearchCommand = new DelegateCommand(() => OnSearch());
}
public void OnSearch()
{
//do something
this.PivotIndex = 2;
}
}
所有这些工作正常,显示枢轴,按钮触发事件并调用 OnSearch() 方法,属性的值已更改。
但是,枢轴显示不会更改为显示名为“第三”的枢轴项目。
我摆弄了很长时间,最终发现如果我删除交互触发器并将视图更改为:
<Button Content="Search" Click="Search_Click" />
并在后面添加代码:
private void Search_Click(object sender, System.Windows.RoutedEventArgs e)
{ ((myViewModel)this.DataContext).OnSearch(); }
然后一切正常。
这有点令人不满意,因为我喜欢在所有页面上对命令事件保持相同的方法,这是不同的。但是在被这种行为困扰了这么久之后,我很高兴终于找到了可行的方法。
但我还是想知道为什么?