2010-09-14 8 views
1

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> 
+0

Comment la relation entre l'élément sélectionné dans la zone de liste et les zones de texte est-elle définie? – Timores

+0

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

+0

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. –

Répondre

0

Voici quelques XAML pour une zone de texte dont la propriété Text est lié à la propriété SelectedItem de la vue de la liste. Il inclut votre code pour sélectionner automatiquement le premier élément lorsqu'il n'y a rien sélectionné.

Est-ce le genre de solution que vous cherchez? Si ce n'est pas le cas, j'ai besoin de plus d'informations, c'est-à-dire de tout le code pertinent sur lequel vous travaillez.

<StackPanel> 
    <TextBox Text="{Binding SelectedItem, ElementName=MyListView}" /> 

    <ListView x:Name="MyListView"> 
     <ListView.Style> 
      <Style TargetType="ListView"> 
       <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> 
      </Style> 
     </ListView.Style> 

     <ListView.Items> 
      <System:String>hello</System:String> 
      <System:String>world</System:String> 
     </ListView.Items> 
    </ListView> 
</StackPanel> 
+0

Je suis certain que cela fonctionnerait, mais ce sont des objets de données qui sont récupérés dans un fil séparé pendant le chargement de la vue. En tant que tel, souvent les objets ne sont pas chargés lorsque le listBox est instancié. Il semble que le retard de chargement entraîne une sorte de notification qui ne se produit pas. – CodeWarrior