Inheritance von WPF UserControls

Veröffentlicht von

Bei Windows Forms ist die Ableitung von UserControls eine einfache Sache. Bei WPF ist es nicht so einfach und nur eingeschränkt möglich.

Wie in WinForms gibt es auch bei WPF UserControls, mit welchen wiederverwendbare Komponenten erstellt werden können.

Im Gegensatz zu WinForms kann man allerdings nicht das Layout vererben und ergänzen. Der Grund sind die Xaml-Dateien, welche nicht vererbt werden können. Von daher läuft es darauf hinaus, dass die Basisklasse nur eine einfache Klasse ohne Xaml-Code sein kann. Aber immerhin. Hier lassen sich Eigenschafen und Logik für alle Controls vereinen.

Den Code gibt es wie immer am Ende zum Download.

Legen wir los. Erstellen wir die Basisklasse:

public class BaseUserControl : UserControl
{
    public string MyLabel
    {
        get
        {
            return (string)GetValue(MyLabelProperty);
        }
        set
        {
            SetValue(MyLabelProperty, value);
        }
    }

    public static readonly DependencyProperty MyLabelProperty =
        DependencyProperty.Register("MyLabel", typeof(string), typeof(BaseUserControl),
        new FrameworkPropertyMetadata());
}

Diese ist abgeleitet von “UserControl” und enthält ein einfaches DependecyProperty.

Nun legen wir ein neues UserControl an, diesmal mit Xaml-Code. Dieses soll von unserem BaseUserControl abgeleitet werden. Dazu ändern wir im Xaml-Code die Definition ab:

zu:

Natürlich auch im Code-Behind:

Nun können wir die UserControls designen, z. B.:

Hier verwenden wir die gemeinsame Eigenschaft MyLabel der Basisklasse. Beim Start der Anwendung erstmal Ernüchterung, das Label wird nicht angezeigt. Das Problem lässt sich aber beheben:

Wir setzen hier den DataContext auf uns selbst. Daher auch der Name im Stackpanel.

<StackPanel x:Name="LayoutRoot">
    <TextBlock Text="{Binding MyLabel}"></TextBlock>
    <ComboBox></ComboBox>
</StackPanel>
LayoutRoot.DataContext = this;

Anschließend wird alles richtig dargestellt:

Download des Beispiels

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert