Bindings sind riskant. Der Xaml-Editor erzwingt zwar die richtige Syntax einer Binding-Setzung, erzwingt aber nicht, dass die angebundene Property ühaupt existiertDas compiliert, und führt nichtmal zum Laufzeit-Absturz. Sondern es funktioniert einfach nicht (und verschlechtert die Performance u.U. erheblich).
Bei richtig angewandtem MVVM–Pattern kennt der Xaml-Editor allerdings den DataContext, und folglich das Viewmodel, das für ein bestimmtes Element gilt. Und dann kann er seinen besonderen Service anbieten, nämlich das Binding-Picking im Property-Fenster:
Also ich kann direkt auswählen aus den Properties meines Viewmodels, und der Xaml-Editor generiert das Xaml für mich:
Ich kann auch Bindings überprüfen - bei falschen Bindings wird die falsche Property unterstrichelt angezeigt:
Jedenfalls, ich hab mal ein klein Folderbrowser-Dialog gebastelt, weil Wpf bis 2010 sowas nicht anbietet
FolderBrowser-Xaml
Und dann habich ein Youtube-Tutorial gebastelt, was v.a. das Binding-Picking zeigt:
DirektLink
Es treten dort auch einige Begrenztheiten des Xaml-Editors zutage:
Etwa beim Setzen eines Bindings innerhalb eines Styles steht kein Binding-Picking zur Verfügung.
Oder beim Zufügen eines StringFormats funkt der Xaml-Editor syntaxwidrigen Code dazwischen, den man erst wieder löschen muß!
Aber im großen und ganzen stellt Binding-Picking eine Art "Option Strict On" für Xaml-Bindings dar, also ein "gepflücktes" Binding funktioniert (höchstwahrscheinlich - auch da gibts leider Ausnahmen), während ein ungestützt hingeschriebenes Binding unendlich viele Fehlermöglichkeiten hinnimmt - und dann einfach nicht funktioniert.
Bei richtig angewandtem MVVM–Pattern kennt der Xaml-Editor allerdings den DataContext, und folglich das Viewmodel, das für ein bestimmtes Element gilt. Und dann kann er seinen besonderen Service anbieten, nämlich das Binding-Picking im Property-Fenster:
Also ich kann direkt auswählen aus den Properties meines Viewmodels, und der Xaml-Editor generiert das Xaml für mich:
Ich kann auch Bindings überprüfen - bei falschen Bindings wird die falsche Property unterstrichelt angezeigt:
Jedenfalls, ich hab mal ein klein Folderbrowser-Dialog gebastelt, weil Wpf bis 2010 sowas nicht anbietet
XML-Quellcode
- <Window x:Class="FolderBrowser"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="FolderBrowser" Height="400" Width="500"
- xmlns:hlp="clr-namespace:System.Windows.Controls;assembly=HelpersSmallEd"
- xmlns:my="clr-namespace:FolderBrowser"
- FocusManager.FocusedElement="{Binding ElementName=tv}" Background="#FFEAE8E4">
- <!--
- -->
- <Window.DataContext>
- <my:DirectoryTree/>
- </Window.DataContext>
- <hlp:GridEx>
- <hlp:GridEx.RowDefinitions>
- <RowDefinition />
- <RowDefinition Height="auto" MinHeight="10" />
- </hlp:GridEx.RowDefinitions>
- <hlp:GridEx.ColumnDefinitions>
- <ColumnDefinition MinWidth="10" Width="Auto" />).A
- <ColumnDefinition />
- </hlp:GridEx.ColumnDefinitions>
- <ItemsControl ItemsSource="{Binding Path=SpecialFolderCommands}" Focusable="False">
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <Button Command="{Binding Path=Command}" Focusable="False">
- <StackPanel>
- <Image Source="{Binding Path=Image}" Height="35" Width="55" />
- <TextBlock HorizontalAlignment="Center" Text="{Binding Path=Caption}"/>
- </StackPanel>
- </Button>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- </ItemsControl>
- <TreeView x:Name="tv"
- hlp:GridEx.Range="b1" ItemsSource="{Binding Path=Drives}"
- hlp:VisualSubscribe.Subscribe="{Binding Path=SubscribeTreeview}" >
- <TreeView.Resources>
- <HierarchicalDataTemplate DataType="{x:Type my:DirectoryNode}" ItemsSource="{Binding Path=Childs}">
- <StackPanel Orientation="Horizontal">
- <Image Width="16" Height="16" Source="{Binding Path=Image}" />
- <TextBlock Margin="2 1 0 1" Text="{Binding Path=Name}" />
- </StackPanel>
- </HierarchicalDataTemplate>
- </TreeView.Resources>
- <TreeView.ItemContainerStyle>
- <Style TargetType="{x:Type TreeViewItem}">
- <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
- <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=OneWay}" />
- </Style>
- </TreeView.ItemContainerStyle>
- </TreeView>
- <DockPanel hlp:GridEx.Range="a2 b">
- <Button x:Name="btOk" Content="Ok" IsDefault="True" Margin="5" Padding="10,0,11,1" />
- <Button x:Name="btCancel" DockPanel.Dock="Right" Content="Cancel" IsCancel="True" Margin="5" />
- <TextBlock Text="{Binding Path=SelectedItem.Fullname}" VerticalAlignment="Center" TextWrapping="Wrap" />
- </DockPanel>
- </hlp:GridEx>
- </Window>
Und dann habich ein Youtube-Tutorial gebastelt, was v.a. das Binding-Picking zeigt:
DirektLink
Es treten dort auch einige Begrenztheiten des Xaml-Editors zutage:
Etwa beim Setzen eines Bindings innerhalb eines Styles steht kein Binding-Picking zur Verfügung.
Oder beim Zufügen eines StringFormats funkt der Xaml-Editor syntaxwidrigen Code dazwischen, den man erst wieder löschen muß!
Aber im großen und ganzen stellt Binding-Picking eine Art "Option Strict On" für Xaml-Bindings dar, also ein "gepflücktes" Binding funktioniert (höchstwahrscheinlich - auch da gibts leider Ausnahmen), während ein ungestützt hingeschriebenes Binding unendlich viele Fehlermöglichkeiten hinnimmt - und dann einfach nicht funktioniert.
Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „ErfinderDesRades“ ()