DataTemplates 的动态加载

Posted

技术标签:

【中文标题】DataTemplates 的动态加载【英文标题】:Dynamic load of DataTemplates 【发布时间】:2022-01-07 18:40:57 【问题描述】:

如何从代码中动态提供数据模板?

我有绑定到 MainWindow 的视图模型 MainWindowViewModel。它看起来像这样:

public class MainWindowViewModel : ViewModelBase


        public int Progress
        
            get => _progress;
            set => RaiseAndSetIfChanged(ref _progress, value);
        

        public ViewModelBase? Content
        
            get => _content;
            set => RaiseAndSetIfChanged(ref _content, value);
        

然后在 MainWindow 中,我根据与 MainWindowViewModel 关联的类型选择了 DataTemplate

<ContentControl Name="Header" Content="Binding Content">
   <ContentControl.ContentTemplate>
     <DataTemplate DataType="x:Type viewModels:DefaultViewModel">
        <local:DefaultView></local:DefaultView>
     </DataTemplate>
</ContentControl.ContentTemplate>

它目前只有一个 DataTemplate,但我想从不同的地方加载它,所以我试图用动态生成的 DataTemplates 列表替换它,因为将来我需要从提供的外部文件加载一些控件按用户。

如何实现?

【问题讨论】:

【参考方案1】:

您可以创建自己的IDataTemplate 实现并将调用动态转发到实际模板。例如。 Avalonia MVVM 模板中的 ViewLocator 如下所示:

    public class ViewLocator : IDataTemplate
    
        public IControl Build(object data)
        
            var name = data.GetType().FullName!.Replace("ViewModel", "View");
            var type = Type.GetType(name);

            if (type != null)
            
                return (Control)Activator.CreateInstance(type)!;
            
            else
            
                return new TextBlock  Text = "Not Found: " + name ;
            
        

        public bool Match(object data)
        
            return data is ViewModelBase;
        
    

【讨论】:

以上是关于DataTemplates 的动态加载的主要内容,如果未能解决你的问题,请参考以下文章

使用具有不同模型和 DataTemplates 的分组 ListView

TabControl 内的 WPF ContentControl 不显示 DataTemplates

无法通过 DataTemplates 设置控制的可见性

WPF 用户控件不呈现。 UserControl 使用 DataTemplates 实例化

如何将视图与viewmodel关联或ViewModel的多个DataTemplates?

CocosCreator-如何动态加载资源