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>
    
已邀请:
尝试将此添加到ListBox。只要任何包含的元素(如TextBox)获得键盘焦点,它就会选择项目。类似的方法也可以与Trigger中的一个简单的setter一起使用,但这往往会干扰ICollectionView上的CurrentItem设置:
         <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。解决这个问题的最简单方法是只处理PreviewMouseDown中ListBoxItems的选择,它将在实际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;
}
    

要回复问题请先登录注册