我有一个非常简单的示例:具有单个表单的 WPF 表单应用程序,其中包含带有数据的字典:
Dim dict As New Collections.Generic.Dictionary(Of String, String)
Private Sub MainWindow_Loaded() Handles Me.Loaded
dict.Add("One", "1")
dict.Add("Two", "2")
dict.Add("Three", "3")
lst1.ItemsSource = dict
End Sub
在表单上,我有一个 ListBox(名为“lst1”),它使用“dict”作为项目源:
<ListBox x:Name="lst1">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Value}"
TextSearch.Text="{Binding Path=Key, Mode=OneWay}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我还有一个未绑定的列表框,手动预填充值:
<ListBox>
<Label TextSearch.Text="One" Content="1" />
<Label TextSearch.Text="Two" Content="2" />
<Label TextSearch.Text="Three" Content="3" />
</ListBox>
所以当我启动应用程序时,它看起来像这样:
问题:
如果我尝试通过键入“一”、“二”或“三”来使用键盘导航项目,我只能在非绑定列表框中成功。绑定列表框失败。
一些评论: 1.)如果我在绑定列表框中按“[”,焦点以循环方式从一个项目变为另一个项目:它从 1 变为 2,从 2 变为 3,从 3 变为 1,从 1 再次变为 2等 2.) 我已经用 Snoop 检查了应用程序。我发现绑定列表框和非绑定列表框之间的一个区别。两个列表框都在标签控件(在 ItemsPresenter 内)上设置了 TextSearch.Text 属性。但对于非绑定情况:TextSearch.Text 属性的“值源”是“本地”。对于绑定案例:“值源”是“ParentTemplate”。
PS(和NB) 我知道我可以在列表框上使用TextSearch.TextPath,但这不是我需要的:) 此外,设置ListViewItem 的TextSearch.Text 属性(通过使用样式)也无济于事。