DataGrids eigenen sich hervorragend zum Anzeigen von Daten im Tabellenformat. Hier findest du ein paar nützliche Beispiele, wie du in WPF mit dem DataGrid-Steuerelement arbeiten kannst.
Eine Datenquelle zuweisen
Damit das Steuerelement die Daten anzeigen kann musst du dieser erst eine Datenquelle, die “ItemSource” zuweisen. Wenn deine Applikation basierend auf dem MVVM-Designmuster erstellt wird, dann wird die Eigenschaft “ItemSource” über eine Bindung (Binding) gesetzt, welche sich im ViewModel befindet.
<DataGrid
   ItemsSource="{Binding Users}
/>ObservableCollection<User> _users = new(); 
public ObservableCollection<User> Users 
{
    get => _users;
    set
    {
        if (value == _users)
            return;
        _users = value;
        OnPropertyChanged();
    }
}Die Funktion OnPropertyChanged() wird von der ViewModel-Basisklasse vererbt. Ein Beispiel hierfür findest du hier.
Benutzerdefinierte Spalten
Textspalten
Um reinen Text in einer Spalte anzuzeigen, kann das Standardelement “DataGridTextColumn” verwendet werden.
<DataGridTextColumn 
    Header="Vorname" 
    Binding="{Binding Firstname}"
    /> Dropdown-Spalten
Um eine Dropdown-Spalte zu erstellen, kann das Standardelement “DataGridComboBoxColumn” verwendet werden.
<DataGridComboBoxColumn 
    Header="MySelection" 
    SelectedValueBinding="{Binding SelectedItem}" 
    >
     <DataGridComboBoxColumn.ElementStyle> 
         <Style TargetType="{x:Type ComboBox}"> 
            <Setter Property="ItemsSource" Value="{Binding Path=ItemsCollection}" />
         </Style> 
     </DataGridComboBoxColumn.ElementStyle> 
     <DataGridComboBoxColumn.EditingElementStyle> 
        <Style TargetType="{x:Type ComboBox}"> 
            <Setter Property="ItemsSource" Value="{Binding Path=ItemsCollection}" /> 
         </Style>
     </DataGridComboBoxColumn.EditingElementStyle> 
 </DataGridComboBoxColumn>Bilder in Spalten anzeigen
Oft kann es nötig sein, komplexere Daten, wie Bilder, im Steuerelement DataGrid anzuzeigen. Hierfür kann das “DataGridTemplateColumn”-Element verwendet werden.
<DataGridTemplateColumn
    Header="Image" Width="80"> 
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate> 
            <Image 
                Source="{Binding Path=Image.Source}" 
                /> 
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>Wenn der Datensatz nicht direkt das Bild, sondern den Dateipfad zum Bild enthält, dann ist ein Converter nötig. Dieser könnte wie folgt aussehen.
public sealed class UriToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Uri i = value as Uri;
        if (i != null)
            BitmapImage im = new BitmapImage();            
            try
            {
                im.BeginInit();
                im.UriSource = i;
                im.EndInit();
            }
            catch(Exception)
            {
                return null;
            }            
            return im;
        else
            return null;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}Alternativ, sofern das Bild als Byte[] vorliegt.
public sealed class ByteArrayToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        byte[] imageAsBytes = value as byte[];
        if (imageAsBytes == null)
            return null;
        BitmapImage image = new BitmapImage();
        using (MemoryStream memStream = new MemoryStream(imageAsBytes))
        {
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.StreamSource = memStream;
            image.EndInit();
        }
        return image;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}Und so kann der Converter dann im XAML verwendet werden.
<UserControl 
    x:Class="MyApp.Views.AboutView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     
    xmlns:viewModels="clr-namespace:MyApp.ViewModels"
    xmlns:converters="clr-namespace:MyApp.Converters"
    mc:Ignorable="d" 
    d:DesignHeight="450" d:DesignWidth="800"
    d:DataContext="{d:DesignInstance viewModels:AboutViewModel}"
    >
    <UserControl.Resources>
        <converters:UriToImageConverter x:Key="UriToImageConverter" />
    </UserControl.Resources>
    <!-- Your XAML Page Content -->
    </UserControl><DataGridTemplateColumn
    Header="Image" Width="80"> 
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate> 
            <Image 
                Source="{Binding Path=ImageUri, 
                    Converter={StaticResource UriToImageConverter}, 
                    UpdateSourceTrigger=Default}" 
                /> 
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>