0

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

我有绑定到 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 列表替换它,因为将来我需要从用户提供的外部文件加载一些控件。

如何做到这一点?

4

1 回答 1

0

您可以创建自己的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;
        }
    }
于 2021-12-01T07:47:08.440 回答