11using System ;
2+ using System . Collections . Generic ;
23using System . Collections . ObjectModel ;
34using System . Collections . Specialized ;
4- using System . Runtime . CompilerServices ;
5+ using JetBrains . Annotations ;
56using UnityEngine . UIElements ;
6- using UnityMvvmToolkit . Common . Extensions ;
77using UnityMvvmToolkit . Common . Interfaces ;
88using UnityMvvmToolkit . Core ;
99using UnityMvvmToolkit . Core . Extensions ;
1010using UnityMvvmToolkit . Core . Interfaces ;
11+ using UnityMvvmToolkit . UITK . Extensions ;
1112
1213namespace UnityMvvmToolkit . UITK . BindableUIElements
1314{
14- public abstract partial class BindableListView < TItemBindingContext > : ListView , IBindableElement
15- where TItemBindingContext : ICollectionItem
15+ public abstract partial class BindableListView < TItemBindingContext > : ListView , IBindableCollection ,
16+ IInitializable , IDisposable where TItemBindingContext : ICollectionItem
1617 {
1718 private VisualTreeAsset _itemTemplate ;
1819
1920 private PropertyBindingData _itemsSourceBindingData ;
2021 private IReadOnlyProperty < ObservableCollection < TItemBindingContext > > _itemsSource ;
2122
2223 private IObjectProvider _objectProvider ;
24+ private List < VisualElement > _itemAssets ;
25+
26+ public virtual void Initialize ( )
27+ {
28+ _itemAssets = new List < VisualElement > ( ) ;
29+ }
30+
31+ public virtual void Dispose ( )
32+ {
33+ for ( var i = 0 ; i < _itemAssets . Count ; i ++ )
34+ {
35+ _itemAssets [ i ] . DisposeBindableElement ( _objectProvider ) ;
36+ }
37+
38+ _itemAssets . Clear ( ) ;
39+ }
2340
2441 public virtual void SetBindingContext ( IBindingContext context , IObjectProvider objectProvider )
2542 {
@@ -28,31 +45,29 @@ public virtual void SetBindingContext(IBindingContext context, IObjectProvider o
2845
2946 _objectProvider = objectProvider ;
3047
31- _itemsSource =
32- objectProvider . RentReadOnlyProperty < ObservableCollection < TItemBindingContext > > ( context ,
33- _itemsSourceBindingData ) ;
48+ _itemsSource = objectProvider
49+ . RentReadOnlyProperty < ObservableCollection < TItemBindingContext > > ( context , _itemsSourceBindingData ) ;
3450 _itemsSource . Value . CollectionChanged += OnItemsCollectionChanged ;
3551
3652 itemsSource = _itemsSource . Value ;
37- makeItem += MakeItem ;
38- bindItem += BindItem ;
39- unbindItem += UnbindItem ;
53+ makeItem += OnMakeItem ;
54+ bindItem += OnBindItem ;
55+ unbindItem += OnUnbindItem ;
4056 }
4157
4258 public virtual void ResetBindingContext ( IObjectProvider objectProvider )
4359 {
44- if ( _itemsSource == null )
60+ if ( _itemsSource is null )
4561 {
4662 return ;
4763 }
4864
4965 _itemsSource . Value . CollectionChanged -= OnItemsCollectionChanged ;
5066
51- makeItem -= MakeItem ;
52- bindItem -= BindItem ;
53- unbindItem -= UnbindItem ;
54-
55- ClearItems ( ) ;
67+ makeItem -= OnMakeItem ;
68+ bindItem -= OnBindItem ;
69+ unbindItem -= OnUnbindItem ;
70+ itemsSource = Array . Empty < TItemBindingContext > ( ) ;
5671
5772 objectProvider . ReturnReadOnlyProperty ( _itemsSource ) ;
5873
@@ -63,39 +78,42 @@ public virtual void ResetBindingContext(IObjectProvider objectProvider)
6378
6479 protected virtual VisualElement MakeItem ( VisualTreeAsset itemTemplate )
6580 {
66- return itemTemplate . InstantiateBindableElement ( ) ; // TODO: Pool.
81+ return itemTemplate
82+ . InstantiateBindableElement ( )
83+ . InitializeBindableElement ( ) ;
6784 }
6885
6986 protected virtual void BindItem ( VisualElement item , int index , TItemBindingContext bindingContext ,
7087 IObjectProvider objectProvider )
7188 {
72- item . SetBindingContext ( bindingContext , objectProvider , true ) ;
89+ item . SetChildsBindingContext ( bindingContext , objectProvider ) ;
7390 }
7491
75- protected virtual void UnbindItem ( VisualElement item , int index , TItemBindingContext bindingContext ,
92+ protected virtual void UnbindItem ( VisualElement item , int index , [ CanBeNull ] TItemBindingContext bindingContext ,
7693 IObjectProvider objectProvider )
7794 {
78- item . ResetBindingContext ( objectProvider , true ) ;
95+ item . ResetChildsBindingContext ( objectProvider ) ;
7996 }
8097
81- private VisualElement MakeItem ( )
98+ private void OnItemsCollectionChanged ( object sender , NotifyCollectionChangedEventArgs e )
8299 {
83- return MakeItem ( _itemTemplate ) ;
100+ RefreshItems ( ) ; // TODO: Do not refresh all items.
84101 }
85102
86- private void BindItem ( VisualElement item , int index )
103+ private VisualElement OnMakeItem ( )
87104 {
88- if ( index >= 0 && index < itemsSource . Count )
89- {
90- BindItem ( item , index , _itemsSource . Value [ index ] , _objectProvider ) ;
91- }
92- else
93- {
94- BindItem ( item , index , default , _objectProvider ) ;
95- }
105+ var item = MakeItem ( _itemTemplate ) ;
106+ _itemAssets . Add ( item ) ;
107+
108+ return item ;
96109 }
97110
98- private void UnbindItem ( VisualElement item , int index )
111+ private void OnBindItem ( VisualElement item , int index )
112+ {
113+ BindItem ( item , index , _itemsSource . Value [ index ] , _objectProvider ) ;
114+ }
115+
116+ private void OnUnbindItem ( VisualElement item , int index )
99117 {
100118 if ( index >= 0 && index < itemsSource . Count )
101119 {
@@ -106,16 +124,5 @@ private void UnbindItem(VisualElement item, int index)
106124 UnbindItem ( item , index , default , _objectProvider ) ;
107125 }
108126 }
109-
110- private void OnItemsCollectionChanged ( object sender , NotifyCollectionChangedEventArgs e )
111- {
112- RefreshItems ( ) ; // TODO: Do not refresh all items.
113- }
114-
115- [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
116- private void ClearItems ( )
117- {
118- itemsSource = Array . Empty < TItemBindingContext > ( ) ;
119- }
120127 }
121128}
0 commit comments