2using Microsoft.Maui.Controls;
6 internal sealed
class ViewSwitcherViewFactory
8 private readonly ViewSwitcher host;
10 public ViewSwitcherViewFactory(ViewSwitcher host)
15 public DataTemplate? ItemTemplate {
get;
set; }
17 public DataTemplateSelector? ItemTemplateSelector {
get;
set; }
19 public Func<object?, View>? ItemViewFactory {
get;
set; }
21 public View CreateView(ViewSwitcherItemDescriptor descriptor)
23 if (descriptor.StateView is not
null)
25 return this.CreateFromStateView(descriptor.StateView);
28 if (descriptor.InlineView is not
null)
30 return descriptor.InlineView;
33 if (descriptor.Item is View existingView)
38 if (descriptor.Item is ViewSwitcherItem wrapper)
40 return this.ResolveInlineWrapper(wrapper);
43 if (this.ItemViewFactory is not
null)
45 View customView = this.ItemViewFactory.Invoke(descriptor.Item);
46 if (customView is
null)
47 throw new InvalidOperationException(
"Custom item view factory returned null.");
49 customView.BindingContext = descriptor.Item;
53 DataTemplate?
template = this.ResolveTemplate(descriptor.Item, descriptor.Index);
54 if (
template is not
null)
56 object? created =
template.CreateContent();
57 View? templatedView = created as View;
58 if (templatedView is not
null)
60 templatedView.BindingContext = descriptor.Item;
63 if (created is ViewCell cell && cell.View is not
null)
65 View cellView = cell.View;
66 cellView.BindingContext = descriptor.Item;
71 Label fallbackLabel =
new Label
73 Text = descriptor.Item?.ToString() ?? string.Empty
75 fallbackLabel.BindingContext = descriptor.Item;
79 private View CreateFromStateView(ViewSwitcherStateView stateView)
81 View? content = stateView.Content;
82 if (content is not
null)
87 if (stateView.ViewType is not
null)
89 object? created = Activator.CreateInstance(stateView.ViewType);
90 if (created is View viewInstance)
92 this.AttachViewModel(stateView, viewInstance);
97 ContentView placeholder =
new ContentView();
98 this.AttachViewModel(stateView, placeholder);
102 private void AttachViewModel(ViewSwitcherStateView stateView, View viewInstance)
104 if (viewInstance.BindingContext is not
null)
107 if (stateView.ViewModelType is
null)
110 object? viewModel = Activator.CreateInstance(stateView.ViewModelType);
111 if (viewModel is not
null)
113 viewInstance.BindingContext = viewModel;
117 private View ResolveInlineWrapper(ViewSwitcherItem wrapper)
119 if (wrapper.Content is not
null)
121 return wrapper.Content;
127 private DataTemplate? ResolveTemplate(
object? item,
int index)
129 if (this.ItemTemplateSelector is not
null)
131 return this.ItemTemplateSelector.SelectTemplate(item, this.host);
134 return this.ItemTemplate;