交互触发器不会让属性更改事件触发

时间:2012-05-19 15:03:53

标签: windows-phone-7 mvvm pivot interaction selectedindex

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

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

然后一切都很完美。

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

但我还是想知道为什么?

1 个答案:

答案 0 :(得分:0)

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

public void OnSearch()
{
    Dispatcher.BeginInvoke(() => {
        this.PivotIndex = 2;
    });
}