.net - 在 ViewModel 中获取 WPF ListView.SelectedItems

标签 .net wpf listview data-binding mvvm

有一些帖子讨论为 ListView.SelectedItems 添加数据绑定(bind)功能具有非平凡的代码量。在我的场景中,我不需要从 ViewModel 设置它,只是获取选定的项目以便对它们执行操作,它是由命令触发的,因此也不需要推送更新。

是否有一个简单的解决方案(就代码行而言),也许在代码隐藏中?只要View,我就可以使用代码隐藏了和 ViewModel不需要互相引用。我认为这是一个更通用的问题:“VM 从按需查看数据的最佳实践”,但我似乎找不到任何东西......

最佳答案

这可以使用交互触发器来实现,如下所示

  • 您将需要添加引用

    Microsoft.Expression.Interactions
    System.Windows.Interactivity

  • 将以下 xmlns 添加到您的 xaml
    xmlns:i="http://schemas.microsoft.com/expression//2010/interactivity"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    

    在您的 GridView 标记内添加下面的代码
    <GridView x:Name="GridName">
    <i:Interaction.Triggers>
       <i:EventTrigger EventName="SelectionChanged">
           <i:InvokeCommandAction Command="{Binding Datacontext.SelectionChangedCommand, ElementName=YourUserControlName}" CommandParameter="{Binding SelectedItems, ElementName=GridName}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    

    ViewModel 中的代码在下面声明属性
    public DelegateCommand<object> SelectionChangedCommand {get;set;}
    

    在 Viewmodel 的构造函数中初始化命令如下
    SelectionChangedCommand = new DelegateCommand<object> (items => {
       var itemList = (items as ObservableCollection<object>).Cast<YourDto>().ToList();
    }
    

    关于.net - 在 ViewModel 中获取 WPF ListView.SelectedItems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10964910/

    相关文章:

    .net - 当 Collection 数据源更新时更新 ListView

    .net - 是否可以检查对象是否已附加到 Entity Framework 中的数据上下文?

    c# - Ioc 中繁忙的构造函数——它们是代码的味道吗?

    c# - 基于 View 模型类型的边框触发器不起作用

    c# - 对列表框中的列表项进行 HitTest

    html - 垂直视口(viewport)被赋予无限高度。 RenderBox 未布局 : RenderViewport#34d12 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE

    java - Android Activity ListView 高亮案例

    javascript - 如何处理 asp.net Httphandler 中的错误?

    wpf - 为什么在 Collection 更改时不调用 Converter?

    android - 将固定的、透明的标题附加到 ListView?