Получить имя выбранного ListBoxItem при нажатии кнопки - PullRequest
0 голосов
/ 04 февраля 2011

Я новичок в WPF / C # и пытаюсь создать простое приложение SQL-запроса, чтобы привыкнуть к нему. У меня есть список и соответствующая кнопка в моем XAML:

<ListBox Name="dbTables" Grid.Column="1" Grid.Row="2">
        <ListBoxItem>Log</ListBoxItem>
        <ListBoxItem>DownloadRequest</ListBoxItem>
        <ListBoxItem>EmailRequest</ListBoxItem>
    </ListBox>

    <!-- View report button -->
    <Button x:Name="myButton" Grid.Column="1" Grid.Row="3" Margin="0,10,0,0" Width="125" Height="25" HorizontalAlignment="Right" Click="Button_Click">View</Button>

и соответствующая функция C #:

 private void Button_Click(object sender, RoutedEventArgs e)
    {
        String curItem = dbTables.SelectedValue.ToString();

        Console.WriteLine("CurItem = " + curItem);
        Results resultsPage = new Results(curItem);
        this.NavigationService.Navigate(resultsPage);

    }

Однако, когда он выводит CurItem, он имеет это значение:

CurItem = System.Windows.Controls.ListBoxItem: Log

Который затем выдает исключение, когда я пытаюсь запустить SQL-запрос. Я пытаюсь заставить его просто быть CurItem = Log

Я пробовал несколько разных способов, но я не могу просто получить имя выбранного значения без прикрепленного определения объекта.

Ответы [ 3 ]

3 голосов
/ 04 февраля 2011

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>
2 голосов
/ 04 февраля 2011

Выбранное значение является ListBoxItem, поэтому вы можете преобразовать значение в ListBoxItem, а затем использовать свойство Content:

ListBoxItem selItem = (ListBoxItem)dbTables.SelectedValue;

        Console.WriteLine(selItem.Content);
0 голосов
/ 04 февраля 2011
String curItem = (dbTables.SelectedValue as ListBoxItem).Content.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...