SelectedItem
возвращает текущий выбранный элемент в списке. Поскольку вы заполняете свой список ListBoxItem
s, это то, что он вернет. (Кстати, обратите внимание, что ваш список автоматически генерирует ListBoxItem
контейнеры для своих элементов - если вы посмотрите в визуальное дерево, вы обнаружите, что этот ListBox
содержит ListBoxItem
s, каждый из которых содержит ListBoxItem
. SelectedItem
содержит содержимое сгенерированного ListBoxItem
, то есть ListBoxItem
, который вы создаете в разметке.)
SelectedValue
возвращает значение свойства SelectedItem
, указанного в ListBox.SelectedValuePath
. Если SelectedValuePath
не задано, возвращается SelectedItem
, поэтому, если вы не знаете о SelectedValuePath
, кажется, что это одно и то же. Но если вы заполните свой список, скажем, Person
объектами и установите SelectedValuePath
на "Name"
, SelectedValue
будет содержать имя выбранного человека, а не ссылку на объект Person
.
Итак, в вашем примере вы можете заставить SelectedValue
возвращать строку, задав для SelectedValuePath
значение "Content"
, которое является свойством ListBoxItem
, содержащего строки, которые вы используете.
Вы можете сделать это другим способом, не создавая явно ListBoxItem
s и просто заполнив ListBox
строками. Для этого вы должны объявить пространство имен, ссылающееся на mscorlib
, чтобы вы могли представлять строковые объекты в XAML, но как только вы это сделаете, результат будет простым:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<DockPanel>
<ListBox DockPanel.Dock="Top" Margin="10" x:Name="test" SelectedValuePath="Length">
<sys:String>Log</sys:String>
<sys:String>DownloadRequest</sys:String>
<sys:String>EmailRequest</sys:String>
</ListBox>
<TextBlock DockPanel.Dock="Top" Margin="10" Text="{Binding ElementName=test, Path=SelectedItem}"/>
<TextBlock DockPanel.Dock="Top" Margin="10" Text="{Binding ElementName=test, Path=SelectedValue}"/>
</DockPanel>
</Page>