Wpf ItemTemplate CurrentItem

У меня простой ListBox.ItemTemplate содержащий Label и TextBox привязан к CSLA Bindable List, Когда я выбираю TextBox CurrentItem не меняется, меняется только если выбрать Label, я имею IsSynchronizedWithCurrentItem='True',

<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 ответа

Решение

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

Это происходит потому, что TextBox обрабатывает событие MouseDown. Поскольку он настроен на пузырьки, он не достигнет содержащего 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;
}
Другие вопросы по тегам