如何在 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;
}
}
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>