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 } }