私の質問は、通常のクリック イベントを使用するときではなく、インタラクション トリガーを使用するときに予期しない動作が見られる理由です。
私の WP7 アプリには、3 つのピボット アイテムを持つピボット コントロールがあります。最初のピボット アイテムには、何かを実行するボタンがあり、現在のピボット アイテムを設定して最後のアイテムを表示する必要があります。他のツールの中でも 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() メソッドが呼び出され、プロパティの値が変更されます。
ただし、ピボット表示は変更されず、'second' という名前のピボット アイテムが表示されます。
私は何年もいじり、最終的に相互作用トリガーを削除してビューを次のように変更すると発見しました:
<Button Content="Search" Click="Search_Click" />
そして、コードビハインドを次のように追加しました:
private void Search_Click(object sender, System.Windows.RoutedEventArgs e)
{ ((myViewModel)this.DataContext).OnSearch(); }
その後、すべてが完全に機能しました。
私はすべてのページでコマンド イベントに対して同じアプローチを維持したいので、これは少し不満ですが、これは異なります。しかし、この動作に長い間悩まされていたので、ようやく機能するものを見つけてうれしく思います.
しかし、私はまだ理由を知りたいですか?