如何在 WP7 中使用 MVVM 检测透视视图

本文关键字:MVVM 检测 透视 视图 WP7 | 更新日期: 2023-09-27 17:56:43

基本上,我的 WP7 应用程序中有一个包含 3 个视图的透视控件。在每个视图上,我调用我运行的 3 个不同 Web 服务中的 1 个。我试图做的是仅在他们导航到该特定视图时才调用服务。

使用后面的代码非常简单,因为您所做的只是将选定的索引与 switch 语句一起使用,您可以相应地触发某些方法。关于如何从视图模型完成此操作的任何想法?

注意:我使用的是 MVVM Light。

更新:这是我通常使用的代码:

private void PivotItem_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int currentPivot = ResultsPivot.SelectedIndex;
        switch (currentPivot)
        {
            case 0:
                //Fire Method 1
                break;
            case 1:
                //Fire Method 2
                break;
            case 2:
                //Fire Method 3
                break;
            default:
                //Fire default method
                break;
        }
    }

如何在 WP7 中使用 MVVM 检测透视视图

MVVMLight 的标准方法是将视图模型拆分为数据和命令。 大多数事情你使用数据绑定相关,属性等,但命令实际上做了一些事情。

在这种情况下,您所说的"Fire 方法 1"是一种普通方法,为了符合您必须转换为命令的模式。 如果你已经有命令,你就知道我在说什么。

EventToCommand 中,您将在

MVVMLight 中使用代码隐藏连接的事件(如 SelectionChanged)的粘附,它是一个 XAML 片段,你将其与透视项一起放在 XAML 中,而不是放在事件处理程序中。

因此,这就是模式:EventToCommand XAML 事件挂接到视图模型命令的关键,无需任何代码隐藏。 最好的办法是使用 MVVMLight 示例来了解EventToCommand的工作原理,因为有很多方法可以使用它。

但这是基本版本:

<controls:PivotItem Name="pivotItem">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding SelectServiceCommand}"
                                CommandParameter="{Binding SelectedIndex, ElementName=pivotItem}"/>
        </i:EventTrigger>
        <!-- other stuff  -->
    </i:Interaction.Triggers>
</controls:PivotItem>

为了使这项工作,SelectServiceCommand必须实际存在于视图模型中,并且它必须采用一个参数并为0,1,2,3等做正确的事情。

这可以通过以下方式解决

<controls:Pivot x:Name="PivotControl"  FontSize="18"  >
        <Custom:Interaction.Triggers>
            <Custom:EventTrigger EventName="SelectionChanged">
                <GalaSoft_MvvmLight_Command:EventToCommand x:Name="VideoPivotClicked"
                                                            Command="{Binding VideoPivotClicked,  Mode=OneWay}" PassEventArgsToCommand="True" />
            </Custom:EventTrigger>
        </Custom:Interaction.Triggers>

然后在您的视图模型中添加此

      public RelayCommand<SelectionChangedEventArgs> VideoPivotClicked
  {
      get;
      private set;
  }
VideoPivotClicked = new RelayCommand<SelectionChangedEventArgs>(arg =>
                                                       {
                                                           PivotItem pivotItem = arg.AddedItems[0] as PivotItem;
                                                           Pivot pivot = pivotItem.Parent as Pivot;
                                                           Debug.WriteLine(pivot.SelectedIndex);
                                                       }
          );

你不会得到你要去的透视项!而不是你要离开的那个。

我没有

直接使用 MVVM Light,但您应该能够将选定的索引/项绑定到视图模型上的属性。当该属性被更改时,您可以进行切换。

我喜欢在

这样的情况下保持简单,在这种情况下,视图需要通知ViewModel一些如此微不足道的事情发生了变化(例如:一个与视图状态无关的微不足道的组合框选择更改(即ViewModel))。

对于您的特定情况,在 switch 语句中,只需在 ViewModel 中调用公共方法。如何获取视图模型引用?您可以通过视图的 DataContext 来获取它。因此,现在您的视图可以在您的视图模型中调用公共方法(和属性)。

对于重要的事情,请坚持使用数据绑定。 否则,只需直接调用。节省了很多时间和麻烦。

我得到的是我要离开的 PivotItem 的索引,而不是我要离开的 PivotItem!.

使用这个:

<controls:Pivot x:Name="pivMain" Title="{Binding AppName}" >
         <Custom:Interaction.Triggers>
            <Custom:EventTrigger EventName="SelectionChanged">
                    <cmd:EventToCommand Command="{Binding SelectServiceCommand}"          
                    CommandParameter="{Binding ElementName=pivMain, Path=SelectedIndex}"/>
             </Custom:EventTrigger>
        </Custom:Interaction.Triggers>