Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
ViewSwitcherViewFactory.cs
1using System;
2using Microsoft.Maui.Controls;
3
5{
6 internal sealed class ViewSwitcherViewFactory
7 {
8 private readonly ViewSwitcher host;
9
10 public ViewSwitcherViewFactory(ViewSwitcher host)
11 {
12 this.host = host;
13 }
14
15 public DataTemplate? ItemTemplate { get; set; }
16
17 public DataTemplateSelector? ItemTemplateSelector { get; set; }
18
19 public Func<object?, View>? ItemViewFactory { get; set; }
20
21 public View CreateView(ViewSwitcherItemDescriptor descriptor)
22 {
23 if (descriptor.StateView is not null)
24 {
25 return this.CreateFromStateView(descriptor.StateView);
26 }
27
28 if (descriptor.InlineView is not null)
29 {
30 return descriptor.InlineView;
31 }
32
33 if (descriptor.Item is View existingView)
34 {
35 return existingView;
36 }
37
38 if (descriptor.Item is ViewSwitcherItem wrapper)
39 {
40 return this.ResolveInlineWrapper(wrapper);
41 }
42
43 if (this.ItemViewFactory is not null)
44 {
45 View customView = this.ItemViewFactory.Invoke(descriptor.Item);
46 if (customView is null)
47 throw new InvalidOperationException("Custom item view factory returned null.");
48
49 customView.BindingContext = descriptor.Item;
50 return customView;
51 }
52
53 DataTemplate? template = this.ResolveTemplate(descriptor.Item, descriptor.Index);
54 if (template is not null)
55 {
56 object? created = template.CreateContent();
57 View? templatedView = created as View;
58 if (templatedView is not null)
59 {
60 templatedView.BindingContext = descriptor.Item;
61 return templatedView;
62 }
63 if (created is ViewCell cell && cell.View is not null)
64 {
65 View cellView = cell.View;
66 cellView.BindingContext = descriptor.Item;
67 return cellView;
68 }
69 }
70
71 Label fallbackLabel = new Label
72 {
73 Text = descriptor.Item?.ToString() ?? string.Empty
74 };
75 fallbackLabel.BindingContext = descriptor.Item;
76 return fallbackLabel;
77 }
78
79 private View CreateFromStateView(ViewSwitcherStateView stateView)
80 {
81 View? content = stateView.Content;
82 if (content is not null)
83 {
84 return content;
85 }
86
87 if (stateView.ViewType is not null)
88 {
89 object? created = Activator.CreateInstance(stateView.ViewType);
90 if (created is View viewInstance)
91 {
92 this.AttachViewModel(stateView, viewInstance);
93 return viewInstance;
94 }
95 }
96
97 ContentView placeholder = new ContentView();
98 this.AttachViewModel(stateView, placeholder);
99 return placeholder;
100 }
101
102 private void AttachViewModel(ViewSwitcherStateView stateView, View viewInstance)
103 {
104 if (viewInstance.BindingContext is not null)
105 return;
106
107 if (stateView.ViewModelType is null)
108 return;
109
110 object? viewModel = Activator.CreateInstance(stateView.ViewModelType);
111 if (viewModel is not null)
112 {
113 viewInstance.BindingContext = viewModel;
114 }
115 }
116
117 private View ResolveInlineWrapper(ViewSwitcherItem wrapper)
118 {
119 if (wrapper.Content is not null)
120 {
121 return wrapper.Content;
122 }
123
124 return wrapper;
125 }
126
127 private DataTemplate? ResolveTemplate(object? item, int index)
128 {
129 if (this.ItemTemplateSelector is not null)
130 {
131 return this.ItemTemplateSelector.SelectTemplate(item, this.host);
132 }
133
134 return this.ItemTemplate;
135 }
136 }
137}