我有一个典型的MVVM场景:
我有一个绑定(bind)到StepsViewModels列表的ListBox。
我定义了一个DataTemplate,以便将StepViewModels呈现为StepViews。
StepView UserControl具有一组标签和文本框。

我想做的是选择一个TextBox聚焦时包裹了StepView的ListBoxItem。我尝试使用以下触发器为TextBox创建样式:

<Trigger Property="IsFocused" Value="true">
    <Setter TargetName="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" Property="IsSelected" Value="True"/>
</Trigger>

但是我收到一个错误消息,告诉我TextBoxs没有IsSelected属性。我现在知道了,但目标是一个ListBoxItem。
我该如何运作?

最佳答案

有一个只读属性IsKeyboardFocusWithin,如果有任何子对象被聚焦,它将被设置为true。您可以使用它在触发器中设置ListBoxItem.IsSelected:

<ListBox ItemsSource="{Binding SomeCollection}" HorizontalAlignment="Left">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
                <Trigger Property="IsKeyboardFocusWithin" Value="True">
                    <Setter Property="IsSelected" Value="True" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Width="100" Margin="5" Text="{Binding Name}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

10-08 07:07