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

    @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; }
    
        }
    }
    Ответ написан