using Avalonia.Controls.Templates; using v2rayN.Desktop.ViewModels; using v2rayN.Desktop.Views; namespace v2rayN.Desktop.Common; public class SimpleViewLocator : IDataTemplate { private static readonly Lazy _instance = new(() => new SimpleViewLocator()); private readonly Dictionary> _locator = new(); private SimpleViewLocator() { RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); RegisterViewFactory(); } public static SimpleViewLocator Instance => _instance.Value; public Control Build(object? data) { if (data is null) { return new TextBlock { Text = "No VM provided" }; } _locator.TryGetValue(data.GetType(), out var factory); return factory?.Invoke() ?? new TextBlock { Text = $"VM Not Registered: {data.GetType()}" }; } public bool Match(object? data) { return data is MyReactiveObject; } public void RegisterViewFactory(Func factory) where TViewModel : class { _locator.Add(typeof(TViewModel), factory); } public void RegisterViewFactory() where TViewModel : class where TView : Control, new() { _locator.Add(typeof(TViewModel), () => new TView()); } }