获取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); }
}
什么情况:
我正在使用 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); }
}