我有一个简单的ListBox.ItemTemplate,其中包含一个Label和一个绑定到CSLA Bindable List的TextBox。当我选择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>发布于 2010-01-23 05:54:19
尝试将其添加到您的ListBox中。每当任何包含的元素(如TextBox)获得键盘焦点时,它都会选择该项。类似的方法也可以用于触发器中的简单设置器,但这往往会干扰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>发布于 2010-01-22 01:34:20
这是因为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;
}https://stackoverflow.com/questions/2110680
复制相似问题