在MVVM中排序和显示ListView SelectedItems

本文关键字:显示 ListView SelectedItems 排序 MVVM | 更新日期: 2023-09-27 18:04:16

我有一个ListView与SelectionMode=Multiple和两个文本框。一个应该显示最上面选择的项目,一个应该显示最下面选择的项目。我也在使用MVVM设计模式工作。

问题如下:

  1. "SelectedItems"从第一个选择点开始索引-因此SelectedItems[0]可以是最底部的选择项,这是不希望的。我想让最上面的项目显示在最上面的框和最下面的项目显示在最下面的框

  2. 我似乎不能引用SelectedItems[SelectedItems。

  3. 从XAML中显示最后选择的项目。

看看我现在的XAML:

<ListView x:Name="myListView" ItemsSource="{Binding MyList}" 
              SelectionMode="Multiple">         
<TextBox x:Name="topTextBox"  Grid.Column="1" Grid.Row="2" 
                 Text="{Binding ElementName=myListView, Path=SelectedItems[0].ID}" />

<TextBox x:Name="bottomTextBox" Grid.Column="1" Grid.Row="3"   
                 Text="{Binding ElementName=myListView, Path=SelectedItems[SelectedItems.Count-1].ID}" />

我不知道最好的方法是什么

在MVVM中排序和显示ListView SelectedItems

我确定的解决方案如下:

我使用了交互式命名空间(不要忘记引用DLL)和以下XAML:
xmlns:interact="http://schemas.microsoft.com/expression/2010/interactivity"

<TextBox x:Name="startTextBox"  Grid.Column="1" Grid.Row="2" 
                 Text="{Binding LatestSelectedItem}" />

 <ListView x:Name="myListView" ItemsSource="{Binding MyList}" 
              SelectionMode="Extended" >
        <interact:Interaction.Triggers>
            <interact:EventTrigger EventName="MouseUp"> <!-- Alternatively, OnSelectionChanged -->
                <interact:InvokeCommandAction Command="{Binding MyListViewSelectionChangedCommand}" 
                                              CommandParameter="{Binding ElementName=myListView, Path=SelectedItems}" />
            </interact:EventTrigger>
        </interact:Interaction.Triggers>
</ListView>

然后我在我的ViewModel中提供了适当的属性,以及以下命令:

    private void MyListView_SelectionChanged(object param)
    {
        IList selectedItems = (IList)param;
        List<MyViewModel> myList = selectedItems.OfType<MyViewModel>().ToList();
        if (myList.Count > 0)
        {
            myList.Sort(); // Implement comparator on MyViewModel
            LatestSelectedItem = myList[myList.Count-1];
        }
    }

没问题。