C# 使用MVVM在UWP中处理ListView项单击的最佳实践

C# 使用MVVM在UWP中处理ListView项单击的最佳实践,c#,listview,events,mvvm,uwp,C#,Listview,Events,Mvvm,Uwp,我需要在使用MVVM的UWP中双击ListView,打开一个新视图(项目详细信息)。在WPF中,我使用了带参数的命令和EventTrigger,但Microsoft不建议在UWP中使用它: 触发器、EventTrigger、Actions和BeginStoryboard不常用。这些API主要是为了与最初用于Microsoft Silverlight的XAML兼容而存在的……对于控件模板中的事件,请使用可视状态和VisualStateManager 据我所知,当您需要更改控件的可视状态,但我需要打

我需要在使用MVVM的UWP中双击
ListView
,打开一个新视图(项目详细信息)。在WPF中,我使用了带参数的命令和
EventTrigger
,但Microsoft不建议在UWP中使用它:

触发器、EventTrigger、Actions和BeginStoryboard不常用。这些API主要是为了与最初用于Microsoft Silverlight的XAML兼容而存在的……对于控件模板中的事件,请使用可视状态和VisualStateManager

据我所知,当您需要更改控件的可视状态,但我需要打开一个新视图时,将使用此选项。
如何使用
VisualStateManager

以下是我的XAML在WPF中的外观:

<ListBox x:Name="PersonsListControl" Grid.RowSpan="3" Grid.Row="0" Grid.Column="2" 
         ItemsSource="{Binding Path=PersonsProvider}" 
         ItemsPanel="{StaticResource PersonsListPanelTemplate}"
         ItemTemplate="{StaticResource PersonsListItemTemplate}"
         SelectedItem="{Binding SelectedPerson}"
         ScrollViewer.HorizontalScrollBarVisibility="Disabled">

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction
                Command="{Binding GetPersonDetailsCommand}"
                CommandParameter="{Binding SelectedPerson}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

</ListBox>

在UWP中,您可以使用
{x:Bind…}

<ListBox ...
         DoubleTapped="{x:Bind HandleDoubleTapped}" />
参考文献:


编辑:
@JörgenSigvardsson指出,
x:Bind
不直接绑定到
DataContext
,您应该创建一个代理属性来访问页面中的特定数据。

关于这方面的更多信息可以阅读

但这不是MVVM,是吗?是的。您正在将
EventHandler
绑定到
ViewModel
中指定的方法。它是由Microsoft自己推荐的。
{x:Bind}
默认情况下不绑定到viewmodel(
DataContext
)。它绑定到页面。如果你想让它成为MVVM,你必须将viewmodel作为一个属性公开,然后点进viewmodel,例如,
{x:Bind viewmodel.property}
@JörgenSigvardsson我刚刚在MSDocs上读到了这一点,但没有意识到这一点被改变了。谢谢你的澄清。
public void HandleDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
    // your logic
}