Два разных DataTemplate

У меня есть два ListBox, определенных в моем XAML, и один класс MyListItem. Теперь один ListBox должен отображать имя как кнопку, а второй ListBox должен отображать имя как TextBlock.

Вот небольшой пример, оба ListBox ведут себя одинаково.

MyListItem

public class MyListItem
{
    private string _name;
    public string Name
    {
        get{return _name;}
        set{_name = value;}
    }
}

XAML

<Window xmlns="https://github.com/avaloniaui"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:DataTemplate.Views.MainWindow"
    xmlns:viewsmodels="clr-namespace:DataTemplate.ViewModels;assembly=DataTemplate"
    xmlns:dt="clr-namespace:DataTemplate;assembly=DataTemplate"
    Title="DataTemplate" Width="700">
<Window.DataContext>
  <viewsmodels:MainWindowViewModel />
</Window.DataContext>    
<Grid ColumnDefinitions="250,250,250">      
  <ItemsControl Grid.Column="1" Items="{Binding List2}">
    <ItemsControl.DataTemplates>
      <DataTemplate DataType="{x:Type dt:MyListItem}">
        <TextBlock Text="{Binding Name}"/>  
      </DataTemplate>
    </ItemsControl.DataTemplates>
  </ItemsControl>
  <ItemsControl Grid.Column="2" Items="{Binding List3}">
    <ItemsControl.DataTemplates>
      <DataTemplate DataType="{x:Type dt:MyListItem}">
        <Button Content="{Binding Name}"/>  
      </DataTemplate>
    </ItemsControl.DataTemplates>
  </ItemsControl>
</Grid>
</Window>

Режим просмотра

public class MainWindowViewModel
{
            public ObservableCollection<MyListItem> List1 { get; set; }
    public ObservableCollection<MyListItem> List2 { get; set; }
    public ObservableCollection<MyListItem> List3 { get; set; }

    public MainWindowViewModel()
    {
        List1 = new ObservableCollection<MyListItem>();
        List2 = new ObservableCollection<MyListItem>();
        List3 = new ObservableCollection<MyListItem>();

        Random rand = new Random();

        for (int i = 0; i < rand.Next(1, 20); i++)
        {
            MyListItem mli = new MyListItem();
            mli.Name = "ListItem" + i;
            List1.Add(mli);
        }

        for (int i = 0; i < rand.Next(1, 20); i++)
        {
            MyListItem mli = new MyListItem();
            mli.Name = "ListItem" + i;
            List2.Add(mli);
        }

        for (int i = 0; i < rand.Next(1, 20); i++)
        {
            MyListItem mli = new MyListItem();
            mli.Name = "ListItem" + i;
            List3.Add(mli);
        }
    }
}

2 ответа

Решение

К сожалению, в настоящее время в Авалонии нет хорошего способа сделать это, о чем я могу думать. Наиболее очевидным способом было бы добавить шаблоны данных в <Style.Resources> сбор и использование {StyleResource} ссылаться на них, но это не работает в настоящее время.

Я думаю, что у вас есть две альтернативы на данный момент:

  1. Просто скопируйте и вставьте шаблоны данных в ItemsControl.ItemTemplate
  2. Определить шаблоны данных в коде и ссылаться на них, используя {Static}, Для этого вы можете использовать FuncDataTemplate<>

Я добавил проблему для отслеживания этой проблемы здесь: https://github.com/AvaloniaUI/Avalonia/issues/1020

Вам необходимо использовать ItemsControl вместо ListBox и настроить ItemTemplate для каждого из них по-разному.

Один будет указывать на DataTemplate(используя x:Key, а не DataType) с TextBlock, а другой - на DataTemplate с Button.

Другие вопросы по тегам