<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>selektor Archive - Robert Skibbe</title>
	<atom:link href="https://robbelroot.de/blog/tag/selektor/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>alias RobbelRoot – Freelance Full Stack Developer .NET</description>
	<lastBuildDate>Mon, 26 Jul 2021 16:50:21 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://robbelroot.de/wp-content/uploads/2020/12/cropped-favicon-32x32.png</url>
	<title>selektor Archive - Robert Skibbe</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>WPF DataTemplate</title>
		<link>https://robbelroot.de/blog/wpf-datatemplate/</link>
					<comments>https://robbelroot.de/blog/wpf-datatemplate/#comments</comments>
		
		<dc:creator><![CDATA[Robert Skibbe]]></dc:creator>
		<pubDate>Mon, 26 Jul 2021 16:50:20 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[C# (C Sharp)]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Visual Basic .NET]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[WPF lernen]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[auswahl]]></category>
		<category><![CDATA[auswählen]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[choose]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[datatemplate]]></category>
		<category><![CDATA[daten]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[selector]]></category>
		<category><![CDATA[selektor]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[vbnet]]></category>
		<category><![CDATA[vorlage]]></category>
		<category><![CDATA[wählen]]></category>
		<guid isPermaLink="false">https://robbelroot.de/?p=4714</guid>

					<description><![CDATA[<p>WPF DataTemplate Du möchtest mehr über ein WPF DataTemplate, bzw. DataTemplates lernen und verstehen wie Diese angewendet werden können? Lerne jetzt, wie Du einzelne Templates deklarieren &#38; anwenden kannst, um deinen Controls unterschiedliche &#8222;Touches&#8220; zu verpassen. Vielleicht hast Du später noch an diesen anderen WPF-Beiträgen Interesse: WPF StackPanel, Mahapps Metro, &#8230;</p>
<p>Der Beitrag <a href="https://robbelroot.de/blog/wpf-datatemplate/">WPF DataTemplate</a> erschien zuerst auf <a href="https://robbelroot.de">Robert Skibbe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><a href="https://robbelroot.de/wp-content/uploads/2021/07/WPF-DataTemplate.png"><img fetchpriority="high" decoding="async" width="1024" height="536" src="https://robbelroot.de/wp-content/uploads/2021/07/WPF-DataTemplate-1024x536.png" alt="WPF DataTemplate" class="wp-image-4719" title="WPF DataTemplate" srcset="https://robbelroot.de/wp-content/uploads/2021/07/WPF-DataTemplate-1024x536.png 1024w, https://robbelroot.de/wp-content/uploads/2021/07/WPF-DataTemplate-300x157.png 300w, https://robbelroot.de/wp-content/uploads/2021/07/WPF-DataTemplate-768x402.png 768w, https://robbelroot.de/wp-content/uploads/2021/07/WPF-DataTemplate-700x366.png 700w, https://robbelroot.de/wp-content/uploads/2021/07/WPF-DataTemplate-332x174.png 332w, https://robbelroot.de/wp-content/uploads/2021/07/WPF-DataTemplate.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption>WPF DataTemplate</figcaption></figure>






<h2 class="wp-block-heading">WPF DataTemplate</h2>



<p>Du <strong>möchtest mehr über </strong>ein WPF <strong>DataTemplate</strong>, bzw. DataTemplates <strong>lernen </strong>und <strong>verstehen wie</strong> Diese <strong>angewendet </strong>werden können?</p>



<p><strong>Lerne </strong>jetzt, <strong>wie </strong>Du <strong>einzelne Templates </strong>deklarieren &amp; anwenden kannst, um deinen <strong>Controls </strong>unterschiedliche &#8222;Touches&#8220; zu <strong>verpassen</strong>.</p>



<p><strong>Vielleicht </strong>hast Du <strong>später noch </strong>an diesen <strong>anderen </strong>WPF-<strong>Beiträgen </strong>Interesse: <strong><a href="https://robbelroot.de/blog/wpf-stackpanel/" target="_blank" rel="noreferrer noopener">WPF StackPanel</a></strong>, <strong><a href="https://robbelroot.de/blog/mahapps-metro/" target="_blank" rel="noreferrer noopener">Mahapps Metro</a></strong>, <strong><a href="https://robbelroot.de/blog/mahapps-metro-projekt-aufsetzen/" target="_blank" rel="noreferrer noopener">Mahapps Metro Projekt aufsetzen</a></strong>.</p>



<h2 class="wp-block-heading">Zu WinForms-Zeiten</h2>



<p><strong>Zuerst </strong>einmal <strong>schauen </strong>wir uns <strong>an</strong>, <strong>wie </strong>man zu &#8222;<strong>damaligen</strong>&#8220; <strong><a href="https://de.wikipedia.org/wiki/Windows_Forms" target="_blank" rel="noreferrer noopener">WinForms</a></strong>&#8211;<strong>Zeiten </strong>noch etwas <strong>Ähnliches </strong>wie DataTemplates <strong>realisieren </strong>konnte.</p>



<p>Leider hat man in <strong>WinForms nicht </strong>so <strong>tolle </strong>Möglichkeiten, die <strong>Ansicht </strong>sauber <strong>von </strong>den <strong>Daten </strong>zu <strong>trennen</strong>.</p>



<p>Meistens hat man <strong>Sachen wie </strong>die <strong>Folgenden </strong>umgesetzt, um z. B. <strong>verschiedene Views </strong>anzuzeigen.</p>



<h3 class="wp-block-heading">Via TabControl</h3>



<p><strong>Eine </strong>vor allem <strong>für Navigationen bekannte Möglichkeit</strong>, ist die Verwendung eines <strong><a href="https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.tabcontrol?view=net-5.0" target="_blank" rel="noreferrer noopener">TabControls</a></strong>.</p>



<p>Das <strong>TabControl erlaubt </strong>dem <strong>Nutzer </strong>das <strong>Anzeigen anderer Ansichten</strong>, durch Klicken auf ein jeweiliges Kopf-Element.</p>



<p>Im <strong>nächsten Beispiel </strong>zeige ich Dir, <strong>wie </strong>Du die <strong>Anzeige </strong>des TabControls <strong>anhand </strong>eines bestimmten <strong>Datentyps </strong>anpassen kannst.</p>



<p><strong>Dazu </strong>habe ich ein <strong>kleines Programm </strong>gebastelt, <strong>Welches </strong>eine <strong>passende Oberfläche, je nach zufällig </strong>generierten <strong>Typ </strong>anzeigt.</p>



<h4 class="wp-block-heading">Darstellung einer normalen Task</h4>



<p><strong>Dieses Bild </strong>bekommst Du angezeigt, <strong>wenn </strong>das Programm per <strong>Zufall </strong>eine &#8222;<strong>normale Aufgabe</strong>&#8220; auswählt.</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/07/TabControl-DataTemplate-Beispiel-mit-TabPages-1.png"><img decoding="async" width="266" height="218" src="https://robbelroot.de/wp-content/uploads/2021/07/TabControl-DataTemplate-Beispiel-mit-TabPages-1.png" alt="TabControl DataTemplate Beispiel mit TabPages 1" class="wp-image-4726" title="TabControl DataTemplate Beispiel mit TabPages 1"/></a><figcaption>TabControl DataTemplate Beispiel mit TabPages 1 – Normale Aufgabe (Task)</figcaption></figure>



<h4 class="wp-block-heading">Darstellung einer erweiterten Task</h4>



<p>Dieses <strong>exemplarisch </strong>andere <strong>Bild </strong>bekommst Du angezeigt, <strong>sobald </strong>das <strong>Programm </strong>eine &#8222;<strong>erweiterte Aufgabe</strong>&#8220; zufällig auswählt.</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/07/TabControl-DataTemplate-Beispiel-mit-TabPages-2.png"><img decoding="async" width="266" height="219" src="https://robbelroot.de/wp-content/uploads/2021/07/TabControl-DataTemplate-Beispiel-mit-TabPages-2.png" alt="TabControl DataTemplate Beispiel mit TabPages 2" class="wp-image-4729" title="TabControl DataTemplate Beispiel mit TabPages 2"/></a><figcaption>TabControl DataTemplate Beispiel mit TabPages 2 – Erweiterte Aufgabe (Task)</figcaption></figure>



<p>Man <strong>könnte </strong>natürlich noch eine <strong>Verbesserung</strong>, <strong>wie </strong>z. B. das <strong>Ausblenden </strong>der TabPage-<strong>Header </strong>hinzufügen.</p>



<p><strong>Damit wäre </strong>es vermutlich noch <strong>deutlicher</strong>, dass das &#8222;<strong>Template</strong>&#8220; <strong>weniger durch </strong>den <strong>Nutzer</strong>, <strong>sondern durch </strong>das <strong>Programm </strong>gewählt wird.</p>



<h3 class="wp-block-heading">Via UserControl</h3>



<p>Die <strong>nächste </strong>sich anbietende <strong>Möglichkeit</strong>, wäre die Nutzung eines <strong>UserControls</strong>, <strong>um </strong>ein passendes <strong>View </strong>je <strong>nach Situation </strong>anzuzeigen.</p>



<p><strong>Auch hier </strong>werde ich das obige <strong>Task</strong>-Beispiel verwenden, <strong>um nicht </strong>zu sehr <strong>vom </strong>bisherigen <strong>Inhalt abzuweichen</strong>.</p>



<h4 class="wp-block-heading">Visuelle Darstellung – TaskView UserControl</h4>



<p>Hier <strong>zeige </strong>ich Dir <strong>analog zum </strong>obigen <strong>Beispiel </strong>eine Darstellung vom <strong>normalen Aufgaben</strong>&#8211;<strong>UserControl</strong>.</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/07/WinForms-UserControl-DataTemplate-Beispiel-1.png"><img loading="lazy" decoding="async" width="258" height="132" src="https://robbelroot.de/wp-content/uploads/2021/07/WinForms-UserControl-DataTemplate-Beispiel-1.png" alt="Task UserControl Template Beispiel" class="wp-image-4736" title="WinForms UserControl DataTemplate Beispiel 1"/></a><figcaption>Task UserControl Template Beispiel</figcaption></figure>



<h4 class="wp-block-heading">Visuelle Darstellung – ExtendedTaskView UserControl</h4>



<p>Nun kommt das <strong>Beispiel </strong>eines UserControls, Welches zur <strong>Darstellung </strong>einer <strong>erweiterten Task </strong>verwendet wird.</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/07/WinForms-UserControl-DataTemplate-Beispiel-2.png"><img loading="lazy" decoding="async" width="253" height="187" src="https://robbelroot.de/wp-content/uploads/2021/07/WinForms-UserControl-DataTemplate-Beispiel-2.png" alt="ExtendedTask UserControl Template Beispiel" class="wp-image-4740" title="WinForms UserControl DataTemplate Beispiel 2"/></a><figcaption>ExtendedTask UserControl Template Beispiel</figcaption></figure>



<h2 class="wp-block-heading">Modern – Mit WPF DataTemplate</h2>



<p>Im letzten und <strong>finalen Beispiel </strong>kommen wir zu dem <strong>WPF DataTemplate</strong>, Welches uns eine <strong>frische </strong>und <strong>moderne Möglichkeit </strong>bietet.</p>



<p>Damit <strong>lösen </strong>wir die <strong>obigen Probleme einfacher </strong>und <strong>effizienter</strong>, sowie <strong>durch WPF </strong>gestützte Technologie wesentlich <strong>performanter</strong>.</p>



<p><strong>Gehen </strong>wir also nun <strong>Schritt für Schritt</strong> die einzelnen Schritte durch, um zu <strong>erfahren wie </strong>man das Ganze <strong>aufbauen </strong>könnte.</p>



<h3 class="wp-block-heading">DataContext festlegen</h3>



<p>Damit überhaupt irgendwelche Daten vom &#8222;<strong>ViewModel</strong>&#8220; ins View wandern, legen wir den &#8222;DataContext&#8220; des &#8222;MainWindows&#8220; fest.</p>



<p>Dazu <strong>erstellen </strong>wir zuerst einmal die &#8222;<strong>MainViewModel</strong>&#8222;-<strong>Klasse</strong>:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="VB.NET" data-enlighter-group="main-view-model-class">    Public Class MainViewModel

        Public Property Tasks As ObservableCollection(Of Task)

        Sub New()
            Tasks = New ObservableCollection(Of Task)
            LoadTasks()
        End Sub

        Private Sub LoadTasks()
            Tasks.Add(New Task("Normal Task", Date.Now))
            Tasks.Add(New ExtendedTask("Extended Task", Date.Now, "The description"))
        End Sub

    End Class</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="C#" data-enlighter-group="main-view-model-class">using System;
using System.Collections.ObjectModel;

namespace WpfApp2
{
    public class MainViewModel
    {

        public ObservableCollection&lt;Task> Tasks { get; set; }

        public MainViewModel()
        {
            Tasks = new ObservableCollection&lt;Task>();
            LoadTasks();
        }

        private void LoadTasks()
        {
            Tasks.Add(new Task("Normal Task", DateTime.Now));
            Tasks.Add(new ExtendedTask("Extended Task", DateTime.Now, "The description"));
        }

    }
}</pre>



<p>Und <strong>weisen </strong>eine <strong>Instanz </strong>dieser Klasse <strong>dann </strong>dem &#8222;<strong>DataContext</strong>&#8220; des &#8222;<strong>MainWindows</strong>&#8220; zu:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="VB.NET" data-enlighter-group="mainwindow-datacontext">Class MainWindow

    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        DataContext = New MainViewModel()
    End Sub

End Class</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="C#" data-enlighter-group="mainwindow-datacontext">using System.Windows;

namespace WpfApp2
{
    /// &lt;summary>
    /// Interaktionslogik für MainWindow.xaml
    /// &lt;/summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            DataContext = new MainViewModel();
        }

    }
}</pre>



<h3 class="wp-block-heading">Simple Auflistung ohne jegliches Template</h3>



<p><strong>Schauen </strong>wir uns dafür im ersten Schritt die <strong>obigen Aufgaben </strong>in einer <strong>simplen</strong> <strong>Auflistung </strong>an.</p>



<p>Dort <strong>wirst </strong>Du <strong>sehen</strong>, <strong>dass </strong>eine jeweilige <strong>Task ohne </strong>großartiges &#8222;<strong>Template</strong>&#8222;, sprich <strong>ohne </strong>jegliche <strong>visuelle Sinnhaftigkeit dargestellt </strong>wird.</p>



<p><strong>Stattdessen </strong>wird eine <strong>Aufgabe mit </strong>der standardmäßigen &#8222;<strong>ToString</strong>&#8222;-Entsprechung <strong>dargestellt</strong>:</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/07/WPF-ListView-Binding-mit-Aufgaben.png"><img loading="lazy" decoding="async" width="262" height="97" src="https://robbelroot.de/wp-content/uploads/2021/07/WPF-ListView-Binding-mit-Aufgaben.png" alt="WPF ListView Binding mit Aufgaben" class="wp-image-4747" title="WPF ListView Binding mit Aufgaben"/></a><figcaption>WPF ListView Binding mit Aufgaben</figcaption></figure>



<p>Letztendlich sehen wir hier <strong>nur </strong>die <strong>String-Darstellung</strong> des vollen <strong>Klassen-Pfades</strong> – nicht wirklich prickelnd.</p>



<h3 class="wp-block-heading">Auflistung mit ToString-Überschreibung</h3>



<p><strong>Nun </strong>sehen wir einmal wie sich das Beispiel verhält, wenn wir die &#8222;<strong>ToString</strong>&#8222;-<strong>Funktion </strong>der <strong>Task-Klassen</strong> <strong>überschreiben</strong>.</p>



<p>Dazu <strong>gehen </strong>wir <strong>in </strong>die jeweilige <strong>Klasse </strong>und <strong>überschreiben </strong>die &#8222;<strong>ToString</strong>&#8222;-Funktionen wie folgt:</p>



<h4 class="wp-block-heading">Task-Klasse</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="VB.NET" data-enlighter-group="task-class">Public Class Task

    Public Property Subject As String

    Public Property [Date] As Date

    Sub New(subject As String, [date] As Date)
        Me.Subject = subject
        Me.Date = [date]
    End Sub

    Public Overrides Function ToString() As String
        Return $"{[Date]:dd.MM.yy HH:mm}: {Subject}"
    End Function

End Class</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="C#" data-enlighter-group="task-class">using System;

namespace WpfApp2
{
    public class Task
    {

        public string Subject { get; set; }

        public DateTime Date { get; set; }

        public Task(string subject, DateTime date)
        {
            Subject = subject;
            Date = date;
        }

        public override string ToString()
        {
            return $"{Date:dd.MM.yy HH:mm}: {Subject}";
        }

    }
}</pre>



<h4 class="wp-block-heading">ExtendedTask-Klasse</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="VB.NET" data-enlighter-group="extended-task-class">Public Class ExtendedTask
    Inherits Task

    Public Property Description As String

    Sub New(subject As String, [date] As Date, description As String)
        MyBase.New(subject, [date])
        Me.Description = description
    End Sub

    Public Overrides Function ToString() As String
        Return $"[ET] {[Date]:dd.MM.yy HH:mm}: {Subject}"
    End Function

End Class</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="C#" data-enlighter-group="extended-task-class">using System;

namespace WpfApp2
{
    public class ExtendedTask : Task
    {

        public string Description { get; set; }

        public ExtendedTask(string subject, DateTime date, string description) : base(subject, date)
        {
            Description = description;
        }

        public override string ToString()
        {
            return $"[ET] {Date:dd.MM.yy HH:mm}: {Subject}";
        }

    }
}
</pre>



<h4 class="wp-block-heading">Aktuelles Ergebnis</h4>



<p>Hier <strong>siehst </strong>Du nun das <strong>aktuelle Ergebnis</strong>, also mit <strong>überschriebenen </strong>&#8222;ToString&#8220;-Funktionen <strong>der Klassen</strong>.</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/07/WPF-ListView-Binding-mit-Aufgaben-ToString-ueberschrieben.png"><img loading="lazy" decoding="async" width="246" height="88" src="https://robbelroot.de/wp-content/uploads/2021/07/WPF-ListView-Binding-mit-Aufgaben-ToString-ueberschrieben.png" alt="WPF ListView Binding mit Aufgaben ToString überschrieben" class="wp-image-4756" title="WPF ListView Binding mit Aufgaben ToString überschrieben"/></a><figcaption>WPF ListView Binding mit Aufgaben ToString überschrieben</figcaption></figure>



<h3 class="wp-block-heading">Mit WPF DataTemplate</h3>



<p>Ganz nach dem &#8222;das Beste kommt zum Schluss&#8220;-Motto, schauen wir uns <strong>nun </strong>das <strong>Beispiel mit DataTemplates</strong> an.</p>



<p>Wir <strong>können </strong>das <strong>Template </strong>dazu z. B. <strong>auf Ressourcen-Ebene erstellen</strong> und darauf referenzieren, <strong>oder </strong>andererseits praktisch <strong>inline definieren</strong>.</p>



<h4 class="wp-block-heading" id="task-data-template">Template verwenden</h4>



<h5 class="wp-block-heading">Template als Window-Ressource definieren</h5>



<p><strong>Definiere mit </strong>diesem <strong>Snippet </strong>ein Template namens &#8222;<strong>TaskTemplate</strong>&#8220; <strong>innerhalb </strong>des <strong>MainWindows</strong>.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    &lt;Window.Resources>
        &lt;DataTemplate x:Key="TaskTemplate">
            &lt;DockPanel Background="WhiteSmoke">
                &lt;TextBlock Text="{Binding Date, StringFormat={}{0:dd.MM.yy HH:mm}}" />
                &lt;TextBlock Text="{Binding Subject}" />
            &lt;/DockPanel>
        &lt;/DataTemplate>
    &lt;/Window.Resources></pre>



<h5 class="wp-block-heading">ListView erstellen</h5>



<p><strong>Erstelle </strong>danach ein neues <strong>ListView </strong>innerhalb des MainWindow-Grids und setze die <strong>ItemsSource</strong>-, sowie die <strong>ItemTemplate</strong>-Eigenschaft.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;Grid>
    &lt;ListView ItemsSource="{Binding Tasks}" ItemTemplate="{StaticResource TaskTemplate}" />
&lt;/Grid></pre>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2021/07/WPF-ListView-Binding-mit-DataTemplate.png"><img loading="lazy" decoding="async" width="252" height="97" src="https://robbelroot.de/wp-content/uploads/2021/07/WPF-ListView-Binding-mit-DataTemplate.png" alt="WPF ListView Binding mit DataTemplate" class="wp-image-4767" title="WPF ListView Binding mit DataTemplate"/></a><figcaption>WPF ListView Binding mit DataTemplate</figcaption></figure>



<p><strong>Wenn </strong>Du <strong>möchtest</strong>, dass die <strong>Items über </strong>die ganze <strong>Breite gezogen </strong>werden, <strong>kannst </strong>Du die &#8222;<strong>HorizontalContentAlignment</strong>&#8222;- und die &#8222;<strong>VerticalContentAlignment&#8220;</strong>-Eigenschaften <strong>auf </strong>&#8222;<strong>Stretch</strong>&#8220; <strong>stellen</strong>.</p>



<p><strong>Jetzt </strong>wäre es natürlich <strong>nur </strong>noch <strong>cool</strong>, <strong>wenn </strong>wir dem <strong>jeweiligen Task-Typ</strong> <strong>unterschiedliche Templates verpassen</strong> könnten – und das <strong>können</strong> <strong>wir</strong>!</p>



<h3 class="wp-block-heading">Mit DataTemplateSelector</h3>



<p><strong>Im </strong>hier <strong>drüber </strong>befindlichen <strong>Beispiel haben </strong>wir für die Darstellung der beiden Tasks <strong>das Selbe Template </strong>verwendet.</p>



<p>Das ist eventuell <strong>nicht </strong>das, <strong>was wir </strong>in erster <strong>möchten</strong>, denn die <strong>verschiedenen </strong>Task-<strong>Klassen </strong>sollen <strong>auch </strong>ggf. <strong>unterschiedliche Templates </strong>verwenden.</p>



<p><strong>Damit </strong>wir zu unserem <strong>Ziel kommen </strong>gewisse <strong>Templates für </strong>entsprechende <strong>Datentypen </strong>zu <strong>wählen</strong>, brauchen wir einen eigenen &#8222;DataTemplateSelector&#8220;.</p>



<h4 class="wp-block-heading">Eigenen Selector erstellen</h4>



<p><strong>Um </strong>einen <strong>eigenen &#8222;DataTemplateSelector&#8220; </strong>zu erstellen, <strong>legen </strong>wir z. B. eine <strong>passende Klasse </strong>namens &#8222;TaskItemTemplateSelector&#8220; <strong>an</strong>.</p>



<p><strong>Darin </strong>müssen wir dann die &#8222;<strong>SelectTemplate</strong>&#8222;-Funktion <strong>überschreiben</strong>, <strong>verwende </strong>dazu z. B. &#8222;Strg+.&#8220;->&#8220;Überschreibungen generieren&#8220; <strong>innerhalb </strong>der <strong>Code </strong>Datei.</p>



<p><strong>In </strong>der <strong>Überschreibung </strong>selbst, <strong>holen </strong>wir uns zuerst den <strong>zugrunde liegenden Datentyp </strong>des &#8222;items&#8220;.</p>



<p><strong>Danach </strong>&#8222;<strong>typecasten</strong>&#8220; wir den Typ des <strong>containers zu </strong>einem &#8222;<strong>FrameworkElement</strong>&#8220; und <strong>haben </strong>dadurch die <strong>Möglichkeit</strong>, die <strong><a href="#task-data-template">Templates aus dem View</a></strong> abzugreifen.</p>



<p>Dann <strong>prüfen </strong>wir, <strong>ob </strong>es sich <strong>bei </strong>dem jeweiligen &#8222;<strong>itemType</strong>&#8220; z. B. <strong>um </strong>den &#8222;<strong>Task</strong>&#8222;-Typ handelt, <strong>wenn ja</strong>, <strong>geben </strong>wir die passende <strong>Template</strong>-Ressource <strong>zurück</strong>.</p>



<p><strong>Anschließend </strong>machen wir das <strong>Gleiche </strong>nur <strong>noch für </strong>die &#8222;<strong>ExtendedTask</strong>&#8220; und <strong>verlassen </strong>wenn <strong>nichts zutrifft </strong>einfach die Funktion mit dem <strong>Rückgabewert </strong>der <strong>Base</strong>-Funktion.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="VB.NET" data-enlighter-group="task-template-selector">Public Class TaskItemTemplateSelector
    Inherits DataTemplateSelector

    Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
        Dim itemType = item.GetType()
        Dim frameworkElement = CType(container, FrameworkElement)

        If itemType Is GetType(Task) Then
            Dim taskTemplate = frameworkElement.FindResource("TaskTemplate")
            Return taskTemplate
        End If

        If itemType Is GetType(ExtendedTask) Then
            Dim extendedTaskTemplate = frameworkElement.FindResource("ExtendedTaskTemplate")
            Return extendedTaskTemplate
        End If

        Return MyBase.SelectTemplate(item, container)
    End Function

End Class</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="C#" data-enlighter-group="task-template-selector">using System.Windows;
using System.Windows.Controls;

namespace WpfApp2
{
    public class TaskItemTemplateSelector : DataTemplateSelector
    {

        public TaskItemTemplateSelector()
        {
        }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            var itemType = item.GetType();
            var frameworkElement = (FrameworkElement)container;

            if (itemType == typeof(Task))
            {
                var taskTemplate = (DataTemplate) frameworkElement.FindResource("TaskTemplate");
                return taskTemplate;
            }

            if (itemType == typeof(ExtendedTask))
            {
                var extendedTaskTemplate = (DataTemplate)frameworkElement.FindResource("ExtendedTaskTemplate");
                return extendedTaskTemplate;
            }

            return base.SelectTemplate(item, container);
        }
    }
}</pre>



<h4 class="wp-block-heading">DataTemplate-Selector einsetzen</h4>



<p><strong>Lege </strong>nun <strong>oben </strong>eine <strong>Ressource für </strong>den jeweiligen &#8222;<strong>Template-Selector</strong>&#8220; an, damit wir Diesen im <strong>XAML-Code</strong> verwenden können:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;Window.Resources>
    &lt;local:TaskItemTemplateSelector x:Key="TaskItemTemplateSelector" />
&lt;/Window.Resources></pre>



<p><strong>Final kannst </strong>Du den <strong>folgenden Code </strong>für das <strong>ListView </strong>verwenden, um den <strong>eben erstellten </strong>&#8222;TemplateSelector&#8220; zu <strong>verwenden</strong>:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;ListView ItemsSource="{Binding Tasks}" ItemTemplateSelector="{StaticResource TaskItemTemplateSelector}" /></pre>



<h2 class="wp-block-heading">Downloads</h2>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link" href="/downloads/vbnet/TabControlExample.zip">VB.NET WinForms TabControl Example</a></div>



<div class="wp-block-button"><a class="wp-block-button__link" href="/downloads/vbnet/UserControlTemplateExample.zip" target="_blank" rel="noreferrer noopener">VB.NET WinForms UserControl Example</a></div>



<div class="wp-block-button"><a class="wp-block-button__link" href="/downloads/vbnet/VBWpfDataTemplateExample.zip" target="_blank" rel="noreferrer noopener">WPF VB.NET DataTemplate Example</a></div>



<div class="wp-block-button"><a class="wp-block-button__link" href="/downloads/cs/CSWpfDataTemplateExample.zip" target="_blank" rel="noreferrer noopener">WPF C# DataTemplate Example</a></div>
</div>
<p>Der Beitrag <a href="https://robbelroot.de/blog/wpf-datatemplate/">WPF DataTemplate</a> erschien zuerst auf <a href="https://robbelroot.de">Robert Skibbe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://robbelroot.de/blog/wpf-datatemplate/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
	</channel>
</rss>
