Два разных 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}
ссылаться на них, но это не работает в настоящее время.
Я думаю, что у вас есть две альтернативы на данный момент:
- Просто скопируйте и вставьте шаблоны данных в
ItemsControl.ItemTemplate
- Определить шаблоны данных в коде и ссылаться на них, используя
{Static}
, Для этого вы можете использоватьFuncDataTemplate<>
Я добавил проблему для отслеживания этой проблемы здесь: https://github.com/AvaloniaUI/Avalonia/issues/1020
Вам необходимо использовать ItemsControl вместо ListBox и настроить ItemTemplate для каждого из них по-разному.
Один будет указывать на DataTemplate(используя x:Key, а не DataType) с TextBlock, а другой - на DataTemplate с Button.