2010-01-21 6 views
0

J'ai un simple ListBox.ItemTemplate contenant un Label et un TextBox lié à un CSLA Bindable List. Lorsque je sélectionne le TextBox le CurrentItem ne change pas, il ne change que si je sélectionne le Label. J'ai IsSynchronizedWithCurrentItem='True'.Wpf ItemTemplate CurrentItem

<ListBox x:Name="ItemsDataGrid" 
     ItemsSource="{Binding Source={StaticResource AuditItems},Path=Items}" 
     IsSynchronizedWithCurrentItem="True"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="200"></ColumnDefinition> 
        <ColumnDefinition Width="100"></ColumnDefinition> 
       </Grid.ColumnDefinitions>   
       <Label Grid.Column="0" 
         Content="{Binding Path=TypeRef}" />      
         <TextBox x:Name="TextBoxQty" 
           Grid.Column="1" 
           Text="{Binding Path=TaliQty}"/>       
      </Grid> 
     </DataTemplate>         
    </ListBox.ItemTemplate>       
</ListBox> 

Répondre

2

Essayez d'ajouter ceci à votre ListBox. Il sélectionne l'élément à chaque fois qu'un élément contenu (comme TextBox) obtient le focus du clavier. Une méthode similaire pourrait aussi être utilisée avec un simple setter dans le Trigger mais cela tend à interférer avec le paramètre CurrentItem sur l'ICollectionView:

  <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Style.Triggers> 
        <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
         <Trigger.EnterActions> 
          <BeginStoryboard x:Name="SetSelected"> 
           <Storyboard> 
            <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsSelected"> 
             <DiscreteBooleanKeyFrame KeyTime="0:00" Value="True" /> 
            </BooleanAnimationUsingKeyFrames> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.EnterActions> 
         <Trigger.ExitActions> 
          <RemoveStoryboard BeginStoryboardName="SetSelected"/> 
         </Trigger.ExitActions> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </ListBox.ItemContainerStyle> 
+0

Excellent, et bien pensé! –

0

Cela se produit car la zone de texte gère l'événement MouseDown. Comme il est défini sur bubble up, il n'atteindra pas le ListBoxItem contenant. Le moyen le plus simple de résoudre ce problème serait de gérer simplement la sélection des ListBoxItems dans le PreviewMouseDown, ce qui se produira et tunnel avant que l'événement MouseDown réel ne s'amorce.

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <EventSetter Event="PreviewMouseDown" 
        Handler="ListBoxItem_PreviewMouseDown" /> 
    </Style> 
</ListBox.ItemContainerStyle> 

Et dans le code derrière le fichier XAML:

private void ListBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var item = (sender as ListBoxItem); 
    if (item != null) 
     item.IsSelected = true; 
} 
+0

Parfait merci, j'ai tout oublié de la bulle! –

Questions connexes