1

私の質問は、通常のクリック イベントを使用するときではなく、インタラクション トリガーを使用するときに予期しない動作が見られる理由です。

私の 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(); }

その後、すべてが完全に機能しました。

私はすべてのページでコマンド イベントに対して同じアプローチを維持したいので、これは少し不満ですが、これは異なります。しかし、この動作に長い間悩まされていたので、ようやく機能するものを見つけてうれしく思います.

しかし、私はまだ理由を知りたいですか?

4

1 に答える 1

0

確かではありませんが、これはスレッド化に関連している可能性があります...次のことを試して、これで問題が解決するかどうかを確認してください。

public void OnSearch()
{
    Dispatcher.BeginInvoke(() => {
        this.PivotIndex = 2;
    });
}
于 2012-05-19T15:56:37.197 に答える