11using System . Collections ;
2+ using System . Collections . Specialized ;
23using System . Windows ;
34using System . Windows . Controls ;
45
56namespace NETworkManager . Controls ;
67
78public class MultiSelectDataGrid : DataGrid
89{
10+ private bool _isUpdatingSelection ;
11+
912 public static readonly DependencyProperty SelectedItemsListProperty =
1013 DependencyProperty . Register ( "SelectedItemsList" , typeof ( IList ) , typeof ( MultiSelectDataGrid ) ,
11- new PropertyMetadata ( null ) ) ;
14+ new PropertyMetadata ( null , OnSelectedItemsListChanged ) ) ;
1215
1316 public MultiSelectDataGrid ( )
1417 {
@@ -21,8 +24,81 @@ public IList SelectedItemsList
2124 set => SetValue ( SelectedItemsListProperty , value ) ;
2225 }
2326
27+ private static void OnSelectedItemsListChanged ( DependencyObject d , DependencyPropertyChangedEventArgs e )
28+ {
29+ if ( d is not MultiSelectDataGrid dataGrid )
30+ return ;
31+
32+ dataGrid . UnsubscribeFromCollectionChanged ( e . OldValue as IList ) ;
33+ dataGrid . SubscribeToCollectionChanged ( e . NewValue as IList ) ;
34+ dataGrid . UpdateSelectedItems ( ) ;
35+ }
36+
37+ private void SubscribeToCollectionChanged ( IList list )
38+ {
39+ if ( list is INotifyCollectionChanged observableCollection )
40+ {
41+ observableCollection . CollectionChanged += OnSelectedItemsListCollectionChanged ;
42+ }
43+ }
44+
45+ private void UnsubscribeFromCollectionChanged ( IList list )
46+ {
47+ if ( list is INotifyCollectionChanged observableCollection )
48+ {
49+ observableCollection . CollectionChanged -= OnSelectedItemsListCollectionChanged ;
50+ }
51+ }
52+
53+ private void OnSelectedItemsListCollectionChanged ( object sender , NotifyCollectionChangedEventArgs e )
54+ {
55+ UpdateSelectedItems ( ) ;
56+ }
57+
58+ private void UpdateSelectedItems ( )
59+ {
60+ if ( _isUpdatingSelection )
61+ return ;
62+
63+ _isUpdatingSelection = true ;
64+
65+ try
66+ {
67+ SelectedItems . Clear ( ) ;
68+
69+ if ( SelectedItemsList != null )
70+ {
71+ foreach ( var item in SelectedItemsList )
72+ {
73+ SelectedItems . Add ( item ) ;
74+ }
75+ }
76+ }
77+ finally
78+ {
79+ _isUpdatingSelection = false ;
80+ }
81+ }
82+
2483 private void DataGridMultiItemSelect_SelectionChanged ( object sender , SelectionChangedEventArgs e )
2584 {
26- SelectedItemsList = SelectedItems ;
85+ if ( _isUpdatingSelection || SelectedItemsList == null )
86+ return ;
87+
88+ _isUpdatingSelection = true ;
89+
90+ try
91+ {
92+ SelectedItemsList . Clear ( ) ;
93+
94+ foreach ( var item in SelectedItems )
95+ {
96+ SelectedItemsList . Add ( item ) ;
97+ }
98+ }
99+ finally
100+ {
101+ _isUpdatingSelection = false ;
102+ }
27103 }
28104}
0 commit comments