using Avalonia.Controls; using Avalonia.Controls.Templates; using Avalonia_PC.ViewModels; using System; using System.Diagnostics.CodeAnalysis; namespace Avalonia_PC { /// /// Given a view model, returns the corresponding view if possible. /// [RequiresUnreferencedCode( "Default implementation of ViewLocator involves reflection which may be trimmed away.", Url = "https://docs.avaloniaui.net/docs/concepts/view-locator")] /// /// 视图定位器,根据 ViewModel 类型自动查找对应的 View, /// 实现 IDataTemplate 以支持 Avalonia 的数据模板机制。 /// public class ViewLocator : IDataTemplate { /// /// 根据 ViewModel 实例构建对应的 View 控件。 /// 约定:将 ViewModels 命名空间中的 ViewModel 替换为 Views 命名空间中的同名 View。 /// /// ViewModel 实例。 /// 对应的 View 控件;若未找到则返回 TextBlock 显示错误信息。 public Control? Build(object? param) { if (param is null) return null; var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal); var type = Type.GetType(name); if (type != null) { return (Control)Activator.CreateInstance(type)!; } return new TextBlock { Text = "Not Found: " + name }; } /// /// 判断数据对象是否为 ViewModel 类型(以 "ViewModel" 结尾)。 /// /// 要判断的数据对象。 /// 是否为 ViewModel。 public bool Match(object? data) { return data is ViewModelBase; } } }