@Alkantel

Как в C# WPF программно создать щаблон данных DataTemplate (не используя XAML)?

Собственно вопрос уже озвучен. Нужно создать такую конструкцию в коде
<ListBoxItem>
                <DataTemplate>
                    <Label></Label>
                    <Label></Label>
                </DataTemplate>
            </ListBoxItem>

Поясню. Есть ListBox, нужно программно создавать Итемы в которых будет несколько элементов, название машины и её модель, например. Ничего вразумительного найти не смог. Прошу подсказать знающих людей. Английский знаю очень плохо.
  • Вопрос задан
  • 4342 просмотра
Решения вопроса 1
@wow1986
Создавать DataTemplate из кода - очень плохая идея. Во первых это сравнительно сложно, во вторых теряется всякая гибость декларативной разметки, в третьих теряется часть функциональности шаблонов. Да и байндинги в коде для такого создавать это просто перебор...
Вот нормальный подход: ItemsSource листбокса делаешь байндинг к коллекции ObservableCollection; в ресурсах создаешь DataTemplate
<Window x:Class="listbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:someData="clr-namespace:listbox"  
        
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>        
        <DataTemplate x:Key="CarItemTemplate" DataType="{x:Type someData:SomeData}">
            <Border Background="DeepSkyBlue" Width="200" Margin="3" CornerRadius="4">
                <Grid>
                    <TextBlock Text="{Binding Name}" Foreground="White" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="30"/>
                    <TextBlock Text="{Binding Count}" Foreground="White"  HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="3"/>
                </Grid>
            </Border>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListBox x:Name="lisbox" DataContext="{Binding}" ItemsSource="{Binding CarCollection}" ItemTemplate="{StaticResource CarItemTemplate}"></ListBox>
    </Grid>
</Window>


а вот код бихайнд:
namespace listbox
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public ObservableCollection<SomeData> CarCollection { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            CarCollection = new ObservableCollection<SomeData>{
                new SomeData{Name="BMW", Count=20},
                new SomeData{Name="Mercedess", Count=30},
                new SomeData{Name="Таврия", Count=200}
            };
            DataContext = this;
        }
    }

    public class SomeData
    {
        public string Name { get; set; }
        public int Count { get; set; }

    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Alkantel Автор вопроса
Хорошо, а как тогда реализовать то что нужно? Там всего то нужно что бы в одном итеме была Марка автомобиля, модель и его фото. Количество авто я заранее не знаю. Как поступить в таком случае?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы