Skip to content

Commit 2703f38

Browse files
committed
Add GetCollectionItemTemplate implementation.
1 parent 008b9d6 commit 2703f38

14 files changed

Lines changed: 100 additions & 28 deletions

File tree

src/UnityMvvmToolkit.Core/AssemblyInfo.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
[assembly: InternalsVisibleTo("UnityMvvmToolkit.UGUI")]
44
[assembly: InternalsVisibleTo("UnityMvvmToolkit.UITK")]
5+
[assembly: InternalsVisibleTo("UnityMvvmToolkit.Common")]
56
[assembly: InternalsVisibleTo("UnityMvvmToolkit.UnitTests")]

src/UnityMvvmToolkit.Core/BindingContextObjectProvider.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using System.Reflection;
45
using System.Runtime.CompilerServices;
@@ -16,11 +17,16 @@ public sealed class BindingContextObjectProvider : IObjectProvider, IDisposable
1617
private readonly ValueConverterHandler _valueConverterHandler;
1718
private readonly BindingContextHandler _bindingContextHandler;
1819

19-
public BindingContextObjectProvider(IValueConverter[] converters)
20+
private readonly IReadOnlyDictionary<Type, object> _collectionItemTemplates;
21+
22+
public BindingContextObjectProvider(IValueConverter[] converters,
23+
IReadOnlyDictionary<Type, object> collectionItemTemplates = null)
2024
{
2125
_valueConverterHandler = new ValueConverterHandler(converters);
2226
_objectWrapperHandler = new ObjectWrapperHandler(_valueConverterHandler);
2327
_bindingContextHandler = new BindingContextHandler(new BindingContextMemberProvider());
28+
29+
_collectionItemTemplates = collectionItemTemplates;
2430
}
2531

2632
public IObjectProvider WarmupAssemblyViewModels()
@@ -138,6 +144,16 @@ public void Dispose()
138144
_bindingContextHandler.Dispose();
139145
}
140146

147+
object IObjectProvider.GetCollectionItemTemplate<T>()
148+
{
149+
if (_collectionItemTemplates.TryGetValue(typeof(T), out var itemTemplate))
150+
{
151+
return itemTemplate;
152+
}
153+
154+
throw new NullReferenceException($"Item template for '{typeof(T)}' not found.");
155+
}
156+
141157
[MethodImpl(MethodImplOptions.AggressiveInlining)]
142158
private TProperty GetProperty<TProperty, TValueType>(IBindingContext context, BindingData bindingData)
143159
{

src/UnityMvvmToolkit.Core/Interfaces/IObjectProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,7 @@ IReadOnlyProperty<TValueType> RentReadOnlyProperty<TValueType>(IBindingContext c
2424

2525
IBaseCommand RentCommandWrapper(IBindingContext context, CommandBindingData bindingData);
2626
void ReturnCommandWrapper(IBaseCommand command, CommandBindingData bindingData);
27+
28+
internal object GetCollectionItemTemplate<T>();
2729
}
2830
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Collections.Generic;
2+
3+
namespace UnityMvvmToolkit.Core.Internal.Extensions
4+
{
5+
internal static class ImmutableDictionary
6+
{
7+
internal static IReadOnlyDictionary<TKey, TValue> Empty<TKey, TValue>()
8+
{
9+
return EmptyDictionary<TKey, TValue>.Value;
10+
}
11+
12+
private static class EmptyDictionary<TKey, TValue>
13+
{
14+
internal static readonly IReadOnlyDictionary<TKey, TValue> Value = new Dictionary<TKey, TValue>();
15+
}
16+
}
17+
}

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/MonoBehaviourView.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Runtime.CompilerServices;
34
using UnityEngine;
45
using UnityMvvmToolkit.Common.Interfaces;
56
using UnityMvvmToolkit.Core;
67
using UnityMvvmToolkit.Core.Interfaces;
8+
using UnityMvvmToolkit.Core.Internal.Extensions;
79

810
// ReSharper disable SuspiciousTypeConversion.Global
911

@@ -66,14 +68,19 @@ protected virtual TBindingContext GetBindingContext()
6668
return _createdBindingContext;
6769
}
6870

71+
protected virtual IObjectProvider GetObjectProvider()
72+
{
73+
return new BindingContextObjectProvider(GetValueConverters(), GetCollectionItemTemplates());
74+
}
75+
6976
protected virtual IValueConverter[] GetValueConverters()
7077
{
7178
return Array.Empty<IValueConverter>();
7279
}
7380

74-
protected virtual IObjectProvider GetObjectProvider()
81+
protected virtual IReadOnlyDictionary<Type, object> GetCollectionItemTemplates()
7582
{
76-
return new BindingContextObjectProvider(GetValueConverters());
83+
return ImmutableDictionary.Empty<Type, object>();
7784
}
7885

7986
[MethodImpl(MethodImplOptions.AggressiveInlining)]

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/AssemblyInfo.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
[assembly: InternalsVisibleTo("UnityMvvmToolkit.UGUI")]
44
[assembly: InternalsVisibleTo("UnityMvvmToolkit.UITK")]
5+
[assembly: InternalsVisibleTo("UnityMvvmToolkit.Common")]
56
[assembly: InternalsVisibleTo("UnityMvvmToolkit.UnitTests")]

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/BindingContextObjectProvider.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using System.Reflection;
45
using System.Runtime.CompilerServices;
@@ -16,11 +17,16 @@ public sealed class BindingContextObjectProvider : IObjectProvider, IDisposable
1617
private readonly ValueConverterHandler _valueConverterHandler;
1718
private readonly BindingContextHandler _bindingContextHandler;
1819

19-
public BindingContextObjectProvider(IValueConverter[] converters)
20+
private readonly IReadOnlyDictionary<Type, object> _collectionItemTemplates;
21+
22+
public BindingContextObjectProvider(IValueConverter[] converters,
23+
IReadOnlyDictionary<Type, object> collectionItemTemplates = null)
2024
{
2125
_valueConverterHandler = new ValueConverterHandler(converters);
2226
_objectWrapperHandler = new ObjectWrapperHandler(_valueConverterHandler);
2327
_bindingContextHandler = new BindingContextHandler(new BindingContextMemberProvider());
28+
29+
_collectionItemTemplates = collectionItemTemplates;
2430
}
2531

2632
public IObjectProvider WarmupAssemblyViewModels()
@@ -138,6 +144,16 @@ public void Dispose()
138144
_bindingContextHandler.Dispose();
139145
}
140146

147+
object IObjectProvider.GetCollectionItemTemplate<T>()
148+
{
149+
if (_collectionItemTemplates.TryGetValue(typeof(T), out var itemTemplate))
150+
{
151+
return itemTemplate;
152+
}
153+
154+
throw new NullReferenceException($"Item template for '{typeof(T)}' not found.");
155+
}
156+
141157
[MethodImpl(MethodImplOptions.AggressiveInlining)]
142158
private TProperty GetProperty<TProperty, TValueType>(IBindingContext context, BindingData bindingData)
143159
{

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/Interfaces/IObjectProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,7 @@ IReadOnlyProperty<TValueType> RentReadOnlyProperty<TValueType>(IBindingContext c
2424

2525
IBaseCommand RentCommandWrapper(IBindingContext context, CommandBindingData bindingData);
2626
void ReturnCommandWrapper(IBaseCommand command, CommandBindingData bindingData);
27+
28+
internal object GetCollectionItemTemplate<T>();
2729
}
2830
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Collections.Generic;
2+
3+
namespace UnityMvvmToolkit.Core.Internal.Extensions
4+
{
5+
internal static class ImmutableDictionary
6+
{
7+
internal static IReadOnlyDictionary<TKey, TValue> Empty<TKey, TValue>()
8+
{
9+
return EmptyDictionary<TKey, TValue>.Value;
10+
}
11+
12+
private static class EmptyDictionary<TKey, TValue>
13+
{
14+
internal static readonly IReadOnlyDictionary<TKey, TValue> Value = new Dictionary<TKey, TValue>();
15+
}
16+
}
17+
}

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/Internal/Extensions/DictionaryExtensions.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)