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();
}
}
}