WPF ListBoxItem IsSelected属性仅为瞬间选择

时间:2017-09-12 14:34:27

标签: wpf

我有一个ListBoxItem模板,其中包含TextBox元素。当用户点击TextBox时,我应该将ListBoxItem作为SelectedItem的{​​{1}}。

ListBox

我有以下触发器进行选择:

<ListBox.ItemTemplate>
        <DataTemplate>
          <DockPanel Margin="4,0,4,0">
            <TextBlock Text="{Binding Path=Value1, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
                        ToolTip="{Binding Path=Hint, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
                        VerticalAlignment="Center" />
            <TextBox x:Name="TextField"                              
                          Margin="2,0,0,0"
                          Width="{Binding Path=ActWidth, Mode=OneWay}"
                          Visibility="{Binding Path=VisibleAct, Mode=OneWay}"
                          />
        </DockPanel>
        </DataTemplate>
</ListBox.ItemTemplate>

不幸的是,它仅适用于 瞬间,当我改变焦点时,选择消失。 如果我删除触发器,它会正常工作,但选择<ListBox.Resources> <Style TargetType="ListBoxItem"> <Style.Triggers> <Trigger Property="IsKeyboardFocusWithin" Value="True"> <Setter Property="IsSelected" Value="True" /> </Trigger> </Style.Triggers> </Style> </ListBox.Resources> 不会触发选择。

如何使选择永久化?

2 个答案:

答案 0 :(得分:1)

您的示例无法正常工作,因为如果触发器为false,则ListBoxItem将获得触发前的值。你的ListBoxItem就像'呃,我是什么......'。

因此,您必须通过添加绑定其SelectedValue状态的默认设置器来设置其IsSelected

<Style TargetType="ListBoxItem">
    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode="OneWay", RelativeSource={RelativeSource Self}}" />
    <Style.Triggers>
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Setter Property="IsSelected" Value="True" />
        </Trigger>
    </Style.Triggers>
</Style>

IsSelected的默认设置器设置为OneWay绑定到自身将完成此任务。当触发器为假时,它会设置IsSelected

答案 1 :(得分:0)

您可以编写一些代码来设置SelectedItem的{​​{1}}属性。您可以处理ListBox的{​​{1}}事件:

GotKeyboardFocus
TextBox