using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Markup; namespace Hyperbar.UI.Windows; public class ImplicitTemplate : MarkupExtension { protected override object ProvideValue(IXamlServiceProvider serviceProvider) => new ImplicitTemplateSelector(); internal class ImplicitTemplateSelector : DataTemplateSelector { protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { string xamlString = @" "; return (DataTemplate)XamlReader.Load(xamlString); } } } public class ViewModelTemplate : MarkupExtension { protected override object ProvideValue(IXamlServiceProvider serviceProvider) => new ViewModelTemplateSelector(); internal class ViewModelTemplateSelector : DataTemplateSelector { protected override DataTemplate SelectTemplateCore(object item) { if (item is IObservableViewModel observableViewModel) { if (observableViewModel.ServiceProvider.GetService() is ViewModelTemplateDescriptorProvider descriptors) { if (descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor) { string xamlString = @$" "; return (DataTemplate)XamlReader.Load(xamlString); } } } return new DataTemplate(); } protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { if (item is IObservableViewModel observableViewModel) { if (observableViewModel.ServiceProvider.GetService() is ViewModelTemplateDescriptorProvider descriptors) { if (descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor) { string xamlString = @$" "; return (DataTemplate)XamlReader.Load(xamlString); } } } return new DataTemplate(); } } }