Wpf ItemTemplate CurrentItem

时间:2010-01-21 16:03:33

标签: wpf binding listbox itemtemplate currentitem

我有一个简单的ListBox.ItemTemplate,其中LabelTextBox绑定到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 个答案:

答案 0 :(得分:2)

尝试将此添加到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>

答案 1 :(得分:0)

发生这种情况是因为TextBox正在处理MouseDown事件。因为它设置为bubble up,它将无法到达包含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;
}