获取ListView的选中项(MVVM,Caliburn.Micro)

Get the selected items of a ListView (MVVM, Caliburn.Micro)

什么情况:

我正在使用 Caliburn.Micro 开发 C# WPF 应用程序。我正在使用 MVVM 模式。

我有一个带有 ContentControl 作为 ItemTemplate 的 ListView。 ListView的ItemsSource绑定到对应ViewModel中ViewModels的一个List(ObservableCollection)。

<ListView ItemsSource="{Binding ViewModelList}" SelectionMode="Extended">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ContentControl cal:View.Model="{Binding}" />
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
    </ListView>

我想要的:

我想获取 ListView 的选定项(所有项),但我不知道如何不违反 MVVM 模式。

在 ContentControl 呈现的 ViewModel 中有一个 属性 "IsSelected" 并以某种方式将其绑定到我的 ListView 会很好。

是否可以这样做或者是否有 another/a 更好的方法?


更新:

这比预期的要容易。我在我的 ViewModel 中添加了一个 属性 public bool IsSelected { get; set; } 并将其放入 ListView 控件中:

<UserControl.Resources>
        <Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource {x:Type ListViewItem}}">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
</UserControl.Resources>

现在我可以通过以下方式获取所选项目:

foreach (var item in ViewModelList)
{
     if (item.IsSelected)
     {
          // Do stuff
     }
}
<Grid>
    <Grid.Resources>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=OneWayToSource}"/>
        </Style>
    </Grid.Resources>
    <ListView ItemsSource="{Binding ViewModelList}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding IsSelected}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal">
                </StackPanel>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
    </ListView>
</Grid>

这可能是您要查找的代码。如果您使用的是多选列表视图,您可以使用以下代码获取所有选定的项目。

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <i:InvokeCommandAction Command="{Binding SelectionChanged}" CommandParameter="{Binding Path=SelectedItems, ElementName=ListViewName}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

将其绑定到视图模型中的命令。

    private ICommand selectionChanged;
    public ICommand SelectionChanged
    {
        get { return selectionChanged; }
        set { SetProperty(ref selectionChanged, value); }
    }