2010-01-21 2 views
0

У меня есть простой ListBox.ItemTemplate, содержащий Label и TextBox, связанный с CSLA Bindable List. Когда я выбираю TextBox, CurrentItem не изменяется, он изменяется только при выборе Label. У меня 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> 

ответ

2

Попробуйте добавить это к вашей ListBox. Он выбирает элемент в любое время, когда любой содержащий элемент (например, TextBox) получает фокус клавиатуры. Подобный метод также может быть использован только с помощью простого сеттер в Trigger, но это, как правило, мешает установке CurrentItem на 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

Отлично, хорошо продумано! –

0

Это происходит потому, что TextBox обрабатывает событие MouseDown. Поскольку он установлен в bubble up, он не достигнет содержащего ListBoxItem. Самый простой способ исправить это - просто обработать выбор ListBoxItems в PreviewMouseDown, который будет происходить и туннелировать до того, как произойдет событие MouseDown.

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

И в коде для файла XAML:

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

Совершенного спасибо, забыл о пузыриться! –

Смежные вопросы