How to bind multiple selection of listview to viewmodel?

后端 未结 9 2002
刺人心
刺人心 2020-12-13 09:14

I am implementing a listview, and a button next to it. I have to be able that when i select multiple items in a listview, and then click on a button, then the selected items

相关标签:
9条回答
  • 2020-12-13 09:57

    If you are using System.Windows.Interactivity and Microsoft.Expression.Interactions already, here is a workaround without any other code/behaviour to mess around. If you need these, it can be download from here

    This workaround make use of interactivity event trigger and interactions set property mechanism in above assemblies.

    Additional namespace declaration in XAML

    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    

    XAML:

    <ListView Name="MyListView" ItemsSource="{Binding ModelList}" DisplayMemberPath="Name"  Grid.Column="0">
      <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
          <ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedItems" Value="{Binding Path=SelectedItems, ElementName=MyListView}"/>
        </i:EventTrigger>
      </i:Interaction.Triggers>
    </ListView>
    

    View Model:

    public class ModelListViewModel
    {
      public ObservableCollection<Model> ModelList { get; set; }
      public ObservableCollection<Model> SelectedModels { get; set; }
    
      public ModelListViewModel() {
        ModelList = new ObservableCollection<Model>();
        SelectedModels = new ObservableCollection<Model>();
      }
    
      public System.Collections.IList SelectedItems {
        get {
          return SelectedModels;
        }
        set {
          SelectedModels.Clear();
          foreach (Model model in value) {
            SelectedModels.Add(model);
          }
        }
      }
    }
    

    In example above, your ViewModel will pick up the selected items whenever the selection on ListView changed.

    0 讨论(0)
  • 2020-12-13 09:58

    As a slight variation on Christian's post, I implemented similar code using the ListView.SelectionChanged event. Instead of calling a method on the ViewModel, I set a property called SelectedItems:

    public void ListView_SelectionChanged( object s, SelectionChangedEventArgs e ) {
        List<Car> mySelectedItems = new List<Car>();
    
        foreach( Car item in myListView.SelectedItems )
            mySelectedItems.Add(item);
    
        ViewModel.SelectedItems = mySelectedItems;
    }
    

    This way, ViewModel.SelectedItems is available for any command you might have in your ViewModel and it can be used for data binding (if you turn it into an ObservableCollection).

    0 讨论(0)
  • 2020-12-13 09:59

    Unfortunately the SelectedItems is a read only not bindable property.

    I found a lot of help from this article How to Databind to a SelectedItems property in WPF

    0 讨论(0)
提交回复
热议问题