This commit is contained in:
TheXamlGuy
2024-02-08 22:26:50 +00:00
parent 2aeb4d1b54
commit 41d003f436
@@ -5,88 +5,36 @@ using Microsoft.UI.Xaml.Markup;
namespace Hyperbar.UI.Windows; namespace Hyperbar.UI.Windows;
public class ImplicitTemplate : public class ViewModelTemplate :
MarkupExtension MarkupExtension
{ {
protected override object ProvideValue(IXamlServiceProvider serviceProvider) => protected override object ProvideValue(IXamlServiceProvider serviceProvider) =>
new ImplicitTemplateSelector(); new ViewModelTemplateSelector();
internal class ImplicitTemplateSelector : internal class ViewModelTemplateSelector :
DataTemplateSelector DataTemplateSelector
{ {
protected override DataTemplate SelectTemplateCore(object item, protected override DataTemplate SelectTemplateCore(object item) =>
DependencyObject container) item is IObservableViewModel observableViewModel &&
{ observableViewModel.ServiceProvider.GetService<IViewModelTemplateDescriptorProvider>()
is ViewModelTemplateDescriptorProvider descriptors &&
descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor
? CreateDataTemplate(descriptor)
: new DataTemplate();
string xamlString = @" protected override DataTemplate SelectTemplateCore(object item,
DependencyObject container) =>
SelectTemplateCore(item);
private DataTemplate CreateDataTemplate(IViewModelTemplateDescriptor descriptor)
{
string xamlString = @$"
<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" <DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:ui=""using:Hyperbar.UI.Windows""> xmlns:ui=""using:{descriptor.TemplateType.Namespace}"">
<ui:ViewModelTemplatePresenter VerticalContentAlignment=""Stretch"" <ui:{descriptor.TemplateType.Name} />
HorizontalContentAlignment=""Stretch""
HorizontalAlignment=""Stretch""
VerticalAlignment=""Stretch""/>
</DataTemplate>"; </DataTemplate>";
return (DataTemplate)XamlReader.Load(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<IViewModelTemplateDescriptorProvider>()
is ViewModelTemplateDescriptorProvider descriptors)
{
if (descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor)
{
string xamlString = @$"
<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:ui=""using:{descriptor.TemplateType.Namespace}"">
<ui:{descriptor.TemplateType.Name} />
</DataTemplate>";
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<IViewModelTemplateDescriptorProvider>()
is ViewModelTemplateDescriptorProvider descriptors)
{
if (descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor)
{
string xamlString = @$"
<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:ui=""using:{descriptor.TemplateType.Namespace}"">
<ui:{descriptor.TemplateType.Name} />
</DataTemplate>";
return (DataTemplate)XamlReader.Load(xamlString);
}
}
}
return new DataTemplate();
}
}
}