WPF DataGrid multiselect binding

后端 未结 4 760
眼角桃花
眼角桃花 2020-12-10 13:00

I have a datagrid that is multi-select enabled. I need to change the selection in the viewmodel. However, the SelectedItems property is read only and can\'t be directly boun

4条回答
  •  抹茶落季
    2020-12-10 13:11

    Andy is correct. DataGridRow.IsSelected is a Dependency Property that can be databound to control selection from the ViewModel. The following sample code demonstrates this:

    
        
            
                
                    
                
                
                    
                
            
            

    using System.ComponentModel;
    using System.Windows;
    
    namespace DataGridMultiSelectSample
    {
        public partial class Window1
        {
            public Window1()
            {
                InitializeComponent();
                DataContext = new[]
                                  {
                                      new MyViewModel {Value = "Able"},
                                      new MyViewModel {Value = "Baker"},
                                      new MyViewModel {Value = "Charlie"},
                                      new MyViewModel {Value = "Dog"},
                                      new MyViewModel {Value = "Fox"},
                                  };
            }
    
            private void Even_Click(object sender, RoutedEventArgs e)
            {
                var array = (MyViewModel[]) DataContext;
                for (int i = 0; i < array.Length; ++i)
                    array[i].IsSelected = i%2 == 0;
            }
    
            private void Odd_Click(object sender, RoutedEventArgs e)
            {
                var array = (MyViewModel[])DataContext;
                for (int i = 0; i < array.Length; ++i)
                    array[i].IsSelected = i % 2 == 1;
            }
        }
    
        public class MyViewModel : INotifyPropertyChanged
        {
            public string Value { get; set; }
    
            private bool mIsSelected;
            public bool IsSelected
            {
                get { return mIsSelected; }
                set
                {
                    if (mIsSelected == value) return;
                    mIsSelected = value;
                    if (PropertyChanged != null)
                        PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
        }
    }
    

    Be sure to set EnableRowVirtualisation="False" on the DataGrid element, else there's a risk that the IsSelected bindings fall out of kilter.

提交回复
热议问题