Nützliche Bindings für WPF-Anwendungen

Allgemein Grundlagen für Bindings unter XAML. Bindings auf Eigenschaften (Properties) von Steuerelementen Folgendes Beispiel erstellt eine Bindung zu dem Steuerelement mit dem Namen „userMenu“ auf die Eigenschaft „Background“. Somit ist gewährleistet, dass der Hintergrund des Untermenüs gleich dem Hintergrund des Hauptmenüs ist. Binding auf statische Inhalte Manchmal kann es nützlich sein, auf statische Inhalte zu…

Image Description

Allgemein

Grundlagen für Bindings unter XAML.

Bindings auf Eigenschaften (Properties) von Steuerelementen

Folgendes Beispiel erstellt eine Bindung zu dem Steuerelement mit dem Namen „userMenu“ auf die Eigenschaft „Background“. Somit ist gewährleistet, dass der Hintergrund des Untermenüs gleich dem Hintergrund des Hauptmenüs ist.

<MenuItem
    Background="{Binding ElementName=userMenu,Path=Background}"
 />
<MenuItem 
    x:Name="userMenu"
    DockPanel.Dock="Right"
    Background="#FF444444"
    Foreground="White"
    VerticalAlignment="Stretch"
    HorizontalAlignment="Stretch"
    Height="48"
    Header="Username"
    > 
    <MenuItem 
        x:Name="userMenuLogout" 
        Background="{Binding ElementName=userMenu,Path=Background}"
        Foreground="{Binding ElementName=userMenu,Path=Foreground}" 
        Header="Abmelden"
        >
    </MenuItem>
</MenuItem>

Binding auf statische Inhalte

Manchmal kann es nützlich sein, auf statische Inhalte zu verweisen.

xmlns:s="clr-namespace:System;assembly=mscorlib"

<Label
    Text="{x:Static s:Environment.UserName}"
/>

Binding auf Settings.Default

Wie du eine Bindung auf ein Settings-Element erstellen kannst, findest du im folgenden Beispiel.

xmlns:properties="clr-namespace:MyApp.Properties"

<Label
    Text="{Binding Source={x:Static properties:Settings.Default}, Path=NAME_OF_PROPERTY}"
/>

Binding auf Eigenschaft vom aktuellen Steuerelement (Self)

Um eine Bindung auf eine Eigenschaft desselben Steuerelement zu erstellen, zeigt dir folgendes Beispiel.

<Label
    Text="{Binding RelativeSource={RelativeSource Self}, Path=Text}"
/>

Binding auf Eigenschaft eines übergeordneten Steuerelement (Parent)

Wie ein Child-Steuerelement auf eine Eigenschaft eines Parent-Steuerelementes zugreifen kann, siehst du folgend.

<Label
    Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window, AncestorLevel=1}}"
/>

Dabei gibt der AncestorType den Datentypen des zu suchenden, übergeordneten Steuerelement. Das AncestorLevel gibt die Tiefe der Suche an. Bei „1“ wird das erste Steuerelement des Typens „Window“ verwendet.

Eingabeelemente

TextBox

Nützliche Bindings für Textboxen.

Bei Enter nächstes Element fokussieren

Manchmal kann es hilfreich sein, wenn durch die „Enter“-Taste das nächste Eingabeelement fokussiert wird. Dies ist mit wenig Code leicht realisierbar.

<UserControl x:Class="Example.Views"
     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:behaviors="http://schemas.microsoft.com/xaml/behaviors"
     
     mc:Ignorable="d" Loaded="UserControl_Loaded" 
     >
    <Grid>
    </Grid>
</UserControl>
<!-- Verhalten für die jeweiligen Eingabeelemente -->
<behaviors:Interaction.Triggers>
    <behaviors:EventTrigger EventName="KeyDown" >
        <behaviors:InvokeCommandAction
            Command="{Binding TextBoxKeyDownEventCommand}"
            PassEventArgsToCommand="True"
            />
    </behaviors:EventTrigger>
</behaviors:Interaction.Triggers>
public ICommand TextBoxKeyDownEventCommand { get => new RelayCommand((p) => TextBoxKeyDownEventAction(p)); }
void TextBoxKeyDownEventAction(object args)
{
    try
    {
        if(args is KeyEventArgs keyArgs)
        {
            if(keyArgs.Key == Key.Enter)
            {
                if (keyArgs.Source is TextBox tb)
                {
                    keyArgs.Handled = true;
                    TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next)
                    {
                        Wrapped = true
                    };
                    tb.MoveFocus(request);
                }
            }
        }
    }
    catch (Exception exc)
    {
        //handle any errors here
    }
}
Tags: , , ,

Was this article helpful to you?

Yes No

Related Articles