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;
}