Wpf ItemTemplate CurrentItem - PullRequest
       22

Wpf ItemTemplate CurrentItem

0 голосов
/ 21 января 2010

У меня есть простой 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 ]

2 голосов
/ 23 января 2010

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

Это происходит потому, что 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;
}
...