1

我的问题是为什么我在使用交互触发器时看到一些意外行为,而不是在使用普通点击事件时。

在我的 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(); }

然后一切正常。

这有点令人不满意,因为我喜欢在所有页面上对命令事件保持相同的方法,这是不同的。但是在被这种行为困扰了这么久之后,我很高兴终于找到了可行的方法。

但我还是想知道为什么?

4

1 回答 1

0

不确定,但这可能与线程有关...尝试以下操作,看看是否可以解决问题:

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