根据 Avalonia ItemsControl 中的 ViewModel 类型选择 DataTemplate

问题描述

UserControl里面有ItemsControl,需要根据Items集合元素类型显示不同DataTemplate的items。

以下基于此答案创建的 TemplateSelector 和 XAML (Selecting a DataTemplate based on DataContext property in Avalonia)

    <ItemsControl Items="{Binding Items}">
        <ItemsControl.DataTemplates>
            <views:ItemsTemplateSelector>
                <DataTemplate x:Key="{x:Type itemViewModels:Item1ViewModel}">
                    <itemsViews:Item1View/>
                </DataTemplate>
                <DataTemplate x:Key="{x:Type itemViewModels:Item2ViewModel}">
                    <itemsViews:Item2View/>
                </DataTemplate>
            </views:ItemsTemplateSelector>
        </ItemsControl.DataTemplates>
    </ItemsControl>
        public ItemsViewModel()
        {
            this.Items = new ObservableCollection<IItemViewModel>();
            this.Items.Add(new Item1ViewModel("Item1"));
            this.Items.Add(new Item2ViewModel("Item2"));
        }

        public ObservableCollection<IitemViewModel> Items { get; }
    public class ItemsTemplateSelector : IDataTemplate
    {
        public bool SupportsRecycling => false;

        [Content]
        public Dictionary<Type,IDataTemplate> Templates { get; } = new Dictionary<Type,IDataTemplate>();

        public IControl Build(object data)
        {
            var type = data.GetType();
            var template = this.Templates[type];
            var control = template.Build(data);

            return control;
        }

        public bool Match(object data)
        {
            return data is IItemViewModel;
        }
    }
    public interface IItemViewModel
    {
        string Name { get; }
    }
    public class Item1ViewModel : IItemViewModel
    {
        public Item1ViewModel (string name)
        {
            this.Name = name;
        }

        public string Name { get; }
    }
<UserControl
  xmlns="https://github.com/avaloniaui"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  x:Class="Desktop.Views.Items.Item1View">

  <TextBlock Text="{Binding Name}"/>

</UserControl>

在运行时出现异常:

Avalonia.Markup.Xaml.XamlLoadException: '没有为 Desktop.Views.Items.Item1View 找到预编译的 XAML,请确保指定 x:Class 并将您的 XAML 文件包含为 AvaloniaResource'

如果在 ItemsControl 而不是 <itemsViews:Item1View/> 中指定 <TextBlock Text="{Binding Name}"/>,则一切正常。但我想将每个项目的标记拆分为具有单独 ViewModel 的单独 XAML 文件。项目可以完全不同。

能否解决这个问题,让ItemsControl根据ViewModel类型选择DataTemplate?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)