{"id":57028,"date":"2021-10-30T08:54:18","date_gmt":"2021-10-30T06:54:18","guid":{"rendered":"https:\/\/ar3dp.de\/docs\/programmieren\/wpf\/datagrid\/"},"modified":"2021-10-30T08:54:18","modified_gmt":"2021-10-30T06:54:18","slug":"datagrid","status":"publish","type":"docs","link":"https:\/\/ar3dp.de\/en\/docs\/programmieren\/wpf\/datagrid\/","title":{"rendered":"DataGrid"},"content":{"rendered":"<p class=\"wp-block-paragraph\">DataGrids eigenen sich hervorragend zum Anzeigen von Daten im Tabellenformat. Hier findest du ein paar n\u00fctzliche Beispiele, wie du in WPF mit dem DataGrid-Steuerelement arbeiten kannst. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Eine Datenquelle zuweisen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Damit das Steuerelement die Daten anzeigen kann musst du dieser erst eine Datenquelle, die &#8220;ItemSource&#8221; zuweisen. Wenn deine Applikation basierend auf dem <a href=\"https:\/\/ar3dp.de\/en\/?p=57030\" target=\"_blank\" rel=\"noreferrer noopener\">MVVM-Designmuster<\/a> erstellt wird, dann wird die Eigenschaft &#8220;ItemSource&#8221; \u00fcber eine Bindung (Binding) gesetzt, welche sich im ViewModel befindet.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;xml&quot;,&quot;mime&quot;:&quot;application\/xml&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;XML&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;xml&quot;}\">&lt;DataGrid\n   ItemsSource=&quot;{Binding Users}\n\/&gt;<\/pre><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csharp&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;C#&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;csharp&quot;}\">ObservableCollection&lt;User&gt; _users = new(); \npublic ObservableCollection&lt;User&gt; Users \n{\n    get =&gt; _users;\n    set\n    {\n        if (value == _users)\n            return;\n\n        _users = value;\n        OnPropertyChanged();\n    }\n}<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Die Funktion OnPropertyChanged() wird von der ViewModel-Basisklasse vererbt. Ein Beispiel hierf\u00fcr findest du <a href=\"https:\/\/ar3dp.de\/en\/docs\/programmieren\/csharp\/viewmodelbase-beispiel\/\" target=\"_blank\" rel=\"noreferrer noopener\">hier<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Benutzerdefinierte Spalten<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Textspalten<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Um reinen Text in einer Spalte anzuzeigen, kann das Standardelement &#8220;DataGridTextColumn&#8221; verwendet werden.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;xml&quot;,&quot;mime&quot;:&quot;application\/xml&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;XML&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;xml&quot;}\">&lt;DataGridTextColumn \n    Header=&quot;Vorname&quot; \n    Binding=&quot;{Binding Firstname}&quot;\n    \/&gt; <\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Dropdown-Spalten<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Um eine Dropdown-Spalte zu erstellen, kann das Standardelement &#8220;DataGridComboBoxColumn&#8221; verwendet werden.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;xml&quot;,&quot;mime&quot;:&quot;application\/xml&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;XML&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;xml&quot;}\">&lt;DataGridComboBoxColumn \n    Header=&quot;MySelection&quot; \n    SelectedValueBinding=&quot;{Binding SelectedItem}&quot; \n    &gt;\n     &lt;DataGridComboBoxColumn.ElementStyle&gt; \n         &lt;Style TargetType=&quot;{x:Type ComboBox}&quot;&gt; \n            &lt;Setter Property=&quot;ItemsSource&quot; Value=&quot;{Binding Path=ItemsCollection}&quot; \/&gt;\n         &lt;\/Style&gt; \n     &lt;\/DataGridComboBoxColumn.ElementStyle&gt; \n     &lt;DataGridComboBoxColumn.EditingElementStyle&gt; \n        &lt;Style TargetType=&quot;{x:Type ComboBox}&quot;&gt; \n            &lt;Setter Property=&quot;ItemsSource&quot; Value=&quot;{Binding Path=ItemsCollection}&quot; \/&gt; \n         &lt;\/Style&gt;\n     &lt;\/DataGridComboBoxColumn.EditingElementStyle&gt; \n &lt;\/DataGridComboBoxColumn&gt;<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Bilder in Spalten anzeigen<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Oft kann es n\u00f6tig sein, komplexere Daten, wie Bilder, im Steuerelement DataGrid anzuzeigen. Hierf\u00fcr kann das &#8220;DataGridTemplateColumn&#8221;-Element verwendet werden. <\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;xml&quot;,&quot;mime&quot;:&quot;application\/xml&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;XML&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;xml&quot;}\">&lt;DataGridTemplateColumn\n    Header=&quot;Image&quot; Width=&quot;80&quot;&gt; \n    &lt;DataGridTemplateColumn.CellTemplate&gt;\n        &lt;DataTemplate&gt; \n            &lt;Image \n                Source=&quot;{Binding Path=Image.Source}&quot; \n                \/&gt; \n        &lt;\/DataTemplate&gt;\n    &lt;\/DataGridTemplateColumn.CellTemplate&gt;\n&lt;\/DataGridTemplateColumn&gt;<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn der Datensatz nicht direkt das Bild, sondern den Dateipfad zum Bild enth\u00e4lt, dann ist ein Converter n\u00f6tig. Dieser k\u00f6nnte wie folgt aussehen.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csharp&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;C#&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;csharp&quot;}\">public sealed class UriToImageConverter : IValueConverter\n{\n    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n    {\n        Uri i = value as Uri;\n        if (i != null)\n            BitmapImage im = new BitmapImage();            \n            try\n            {\n                im.BeginInit();\n                im.UriSource = i;\n                im.EndInit();\n            }\n            catch(Exception)\n            {\n                return null;\n            }            \n            return im;\n        else\n            return null;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n    {\n        throw new NotSupportedException();\n    }\n}<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Alternativ, sofern das Bild als Byte[] vorliegt.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csharp&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;C#&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;csharp&quot;}\">public sealed class ByteArrayToImageConverter : IValueConverter\n{\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        byte[] imageAsBytes = value as byte[];\n        if (imageAsBytes == null)\n            return null;\n\n        BitmapImage image = new BitmapImage();\n        using (MemoryStream memStream = new MemoryStream(imageAsBytes))\n        {\n            image.BeginInit();\n            image.CacheOption = BitmapCacheOption.OnLoad;\n            image.StreamSource = memStream;\n            image.EndInit();\n        }\n        return image;\n    }\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n    {\n        throw new NotImplementedException();\n    }\n}<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Und so kann der Converter dann im XAML verwendet werden.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;xml&quot;,&quot;mime&quot;:&quot;application\/xml&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;XML&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;xml&quot;}\">&lt;UserControl \n    x:Class=&quot;MyApp.Views.AboutView&quot;\n    xmlns=&quot;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation&quot;\n    xmlns:x=&quot;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml&quot;\n    xmlns:mc=&quot;http:\/\/schemas.openxmlformats.org\/markup-compatibility\/2006&quot; \n    xmlns:d=&quot;http:\/\/schemas.microsoft.com\/expression\/blend\/2008&quot; \n     \n    xmlns:viewModels=&quot;clr-namespace:MyApp.ViewModels&quot;\n    xmlns:converters=&quot;clr-namespace:MyApp.Converters&quot;\n\n    mc:Ignorable=&quot;d&quot; \n    d:DesignHeight=&quot;450&quot; d:DesignWidth=&quot;800&quot;\n    d:DataContext=&quot;{d:DesignInstance viewModels:AboutViewModel}&quot;\n    &gt;\n    &lt;UserControl.Resources&gt;\n        &lt;converters:UriToImageConverter x:Key=&quot;UriToImageConverter&quot; \/&gt;\n    &lt;\/UserControl.Resources&gt;\n\n    &lt;!-- Your XAML Page Content --&gt;\n    &lt;\/UserControl&gt;<\/pre><\/div>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;xml&quot;,&quot;mime&quot;:&quot;application\/xml&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;XML&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;xml&quot;}\">&lt;DataGridTemplateColumn\n    Header=&quot;Image&quot; Width=&quot;80&quot;&gt; \n    &lt;DataGridTemplateColumn.CellTemplate&gt;\n        &lt;DataTemplate&gt; \n            &lt;Image \n                Source=&quot;{Binding Path=ImageUri, \n                    Converter={StaticResource UriToImageConverter}, \n                    UpdateSourceTrigger=Default}&quot; \n                \/&gt; \n        &lt;\/DataTemplate&gt;\n    &lt;\/DataGridTemplateColumn.CellTemplate&gt;\n&lt;\/DataGridTemplateColumn&gt;<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>N\u00fctzliche Code-Beispiele f\u00fcr das DataGrid Steuerelement<\/p>","protected":false},"author":1,"featured_media":0,"parent":54212,"menu_order":1,"comment_status":"open","ping_status":"closed","template":"","meta":{"_featured":false,"_is_vendor_doc":"0","footnotes":""},"doc_tag":[912,910,908,913,909,911],"class_list":["post-57028","docs","type-docs","status-publish","hentry","doc_tag-anzeigen","doc_tag-control","doc_tag-datagrid","doc_tag-daten","doc_tag-steuerelement","doc_tag-tabelle"],"comment_count":0,"_links":{"self":[{"href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/docs\/57028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/comments?post=57028"}],"version-history":[{"count":0,"href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/docs\/57028\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/docs\/54212"}],"next":[{"title":"MVVM - Model-View-ViewModel Design","link":"https:\/\/ar3dp.de\/en\/docs\/programmieren\/wpf\/mvvm-model-view-viewmodel-design\/","href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/docs\/57030"}],"prev":[{"title":"N\u00fctzliche Bindings f\u00fcr WPF-Anwendungen","link":"https:\/\/ar3dp.de\/en\/docs\/programmieren\/wpf\/nuetzliche-bindings-fuer-wpf-anwendungen\/","href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/docs\/57001"}],"wp:attachment":[{"href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/media?parent=57028"}],"wp:term":[{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/ar3dp.de\/en\/wp-json\/wp\/v2\/doc_tag?post=57028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}