【问题标题】:Best practice to handle ListView ItemClick in UWP using MVVM使用 MVVM 在 UWP 中处理 ListView ItemClick 的最佳实践
【发布时间】:2017-10-11 18:54:05
【问题描述】:

我需要使用 MVVM 在 UWP 中通过鼠标双击 ListView 打开一个新视图(项目详细信息)。在 WPF 中,我使用了带参数的命令和 EventTrigger,但微软不建议在 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>

【问题讨论】:

    标签: c# listview events mvvm uwp


    【解决方案1】:

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

    <ListBox ...
             DoubleTapped="{x:Bind HandleDoubleTapped}" />
    

    在你的ViewModel 中创建一个方法:

    public void HandleDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
    {
        // your logic
    }
    

    参考资料:
    DoubleTapped
    ListBox


    编辑:
    @JörgenSigvardsson 指出 x:Bind 不直接绑定到 DataContext,您应该创建一个或多个代理属性以从您的页面访问特定数据。
    更多内容可以阅读here

    【讨论】:

    • 但这不是 MVVM,是吗?
    • 是的。您将EventHandler 绑定到ViewModel 中的指定方法。是微软自己推荐的。
    • {x:Bind} 默认情况下不绑定到视图模型 (DataContext)。它绑定到页面。如果要使其成为 MVVM,则必须将视图模型公开为属性,然后点到视图模型中,例如{x:Bind ViewModel.Property }
    • @JörgenSigvardsson 我刚刚在 MSDocs 上读到了这一点,并没有意识到这一点正在改变。谢谢你的澄清。
    猜你喜欢
    • 1970-01-01
    • 2023-02-05
    • 2018-12-27
    • 2017-03-11
    • 2018-12-14
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多