J'ai une vue avec une zone de liste et plusieurs zones de texte liées aux propriétés des objets affichés dans la zone de liste. À l'ouverture, la zone de liste est remplie avec des données, et j'ai le suivant dans le style pour m'assurer que quand il y a des éléments et rien n'est sélectionné, pour sélectionner le 1er élément.Mise à jour obligatoire de liaison dans XAML
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="SelectedItem" Value="{x:Null}"/>
<Condition Property="HasItems" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="SelectedIndex" Value="0"/>
</MultiTrigger>
</Style.Triggers>
Cela fonctionne. Le premier élément de la liste est toujours sélectionné lorsque la liste est remplie.
Malheureusement, même si le premier élément est sélectionné, les zones de texte liées aux propriétés SelectedItems (via leur grille parent Datacontext) ne semblent pas recevoir de notification. Tout le monde connaît un moyen de les forcer à mettre à jour (en XAML si possible). Actuellement, les fixations ressemblent à ceci:
<TextBox Text="{Binding Weight, ConverterParameter=\{0:F\}, Converter={StaticResource FormattingConverter}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" />
Toute aide serait grandement appréciée.
Cory
================= Modifier ====================
Ci-dessous le XAML montrant la grille PackageDetailsGrid en utilisant la PackageList SelectedItem comme il est datacontext:
<StackPanel Orientation="Vertical" d:LayoutOverrides="Height">
<TextBlock Text="Packages" Style="{DynamicResource TitleText}"/>
<ListBox x:Name="PackageList" Style="{StaticResource SnazzyList}" FocusVisualStyle="{x:Null}" Margin="0" ItemsSource="{Binding Source={StaticResource Packages}}" HorizontalContentAlignment="Stretch" Height="132.5" Background="#18000000">
</ListBox>
<Grid Margin="0,0,8,0">
<Button Content="Add" Margin="20,0,0,0" Width="87" HorizontalAlignment="Left" Style="{DynamicResource ClearButton}" Command="{Binding AddPackageCommand}" Visibility="{Binding ShipmentRecord.TransitStatus, Converter={StaticResource ShippedToVisibilityConverter}}"/>
<Button Content="Delete" Margin="0,0,20,0" Style="{DynamicResource ClearButton}" HorizontalAlignment="Right" Width="87" Height="21.4666666666667" Command="{Binding DeletePackageCommand}" CommandParameter="{Binding SelectedItem, ElementName=PackageList, Mode=Default}" Visibility="{Binding ShipmentRecord.TransitStatus, Converter={StaticResource ShippedToVisibilityConverter}}"/>
</Grid>
</StackPanel>
<Grid x:Name="PackageDetailsGrid" Margin="0" Grid.Column="1" DataContext="{Binding Items.CurrentItem, ElementName=PackageList, Mode=Default}">
<StackPanel Margin="0">
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40*"/>
<ColumnDefinition Width="60*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Dimensions" Foreground="White" FontWeight="Bold"/>
<StackPanel Grid.Column="1" Orientation="Horizontal" d:LayoutOverrides="Height">
<TextBox Text="{Binding Height, ConverterParameter=\{0:F\}, Converter={StaticResource FormattingConverter}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Width="48" TextWrapping="Wrap" Margin="0" HorizontalAlignment="Left" IsEnabled="{Binding CanEnterPackageDetails}">
<i:Interaction.Behaviors>
<local:SelectAllOnFocusTextboxBehavior/>
</i:Interaction.Behaviors>
</TextBox>
<TextBlock Text="X" Style="{DynamicResource XTextBlockStyle}"/>
<TextBox Text="{Binding Width, ConverterParameter=\{0:F\}, Converter={StaticResource FormattingConverter}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Width="48" TextWrapping="Wrap" Margin="0" HorizontalAlignment="Left" IsEnabled="{Binding CanEnterPackageDetails}">
<i:Interaction.Behaviors>
<local:SelectAllOnFocusTextboxBehavior/>
</i:Interaction.Behaviors>
</TextBox>
<TextBlock Text="X" Style="{DynamicResource XTextBlockStyle}"/>
<TextBox Text="{Binding Length, ConverterParameter=\{0:F\}, Converter={StaticResource FormattingConverter}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Width="48" TextWrapping="Wrap" Margin="0" HorizontalAlignment="Left" IsEnabled="{Binding CanEnterPackageDetails}">
<i:Interaction.Behaviors>
<local:SelectAllOnFocusTextboxBehavior/>
</i:Interaction.Behaviors>
</TextBox>
</StackPanel>
</Grid>
</StackPanel>
</Grid>
Comment la relation entre l'élément sélectionné dans la zone de liste et les zones de texte est-elle définie? – Timores
La zone de texte est dans une grille avec son datacontext défini sur l'élément sélectionné dans le contrôle ListBox. Il y a quelques bizarreries avec cette configuration. Par exemple. S'il n'y a qu'un objet dans la liste et qu'il est sélectionné automatiquement, les zones de texte restent vides. Si vous cliquez sur l'élément, il n'est pas sélectionné pour le resélectionner, ce qui fait que les zones de texte restent vides. S'il y a deux éléments ou plus, je peux sélectionner un élément (pas le premier) et tout fonctionne comme prévu. Les zones de texte sont mises à jour avec les valeurs de propriété de l'élément sélectionné dans la zone de liste. – CodeWarrior
Veuillez nous donner la liaison sur la grille avec le datacontext parent; cette configuration semble bien et devrait se comporter comme prévu, autant que je sache. –