Получить выбранный элемент ListBox - PullRequest
1 голос
/ 13 февраля 2012

Я играю с этим уже 1 день, и я собираюсь сдаться.По сути, дело в том, что я получил ListBox, содержащий пользовательские объекты (продукты), которые поступают из базы данных.Заполнение и сортировка работает, но получение значений из выбранного элемента отсутствует.

Класс продукта:

public class Product {   
//properties
public int ID { get; set; }
public String Name { get; set; }
public String Info { get; set; }
public int Stock { get; set; }
public float Price { get; set; }
}

XAML из ListBox в frmUser:

<Window.Resources>
    <DataTemplate x:Key="listBoxTemplate">
        <StackPanel Margin="4">
            <DockPanel >
                <TextBlock FontWeight="Bold" Text="Product ID: " DockPanel.Dock="Left" Margin="5,0,10,0" Foreground="White" FontSize="13" />
                <TextBlock Text="{Binding productId}" Foreground="White" />
            </DockPanel>
            <DockPanel >
                <TextBlock FontWeight="Bold" Text="Naam: " DockPanel.Dock="Left" Margin="5,0,10,0" Foreground="White" FontSize="13"/>
                <TextBlock Text="{Binding naam}" />
            </DockPanel>
            <DockPanel >
                <TextBlock FontWeight="Bold" Text="Omschrijving: " DockPanel.Dock="Left" Margin="5,0,10,0" Foreground="White" FontSize="13"/>
                <TextBlock Text="{Binding omschrijving}" />
            </DockPanel>
            <DockPanel >
                <TextBlock FontWeight="Bold" Text="Voorraad: " DockPanel.Dock="Left" Margin="5,0,10,0" Foreground="White" FontSize="13"/>
                <TextBlock Text="{Binding voorraad}" />
            </DockPanel>
            <DockPanel >
                <TextBlock FontWeight="Bold" Text="Prijs: " DockPanel.Dock="Left" Margin="5,0,10,0" Foreground="White" FontSize="13"/>
                <TextBlock Text="{Binding prijs}" />
            </DockPanel>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

Ипривязка выполняется, когда пользователь щелкает, чтобы заполнить ListBox:

private void fillDataGrid(object sender, RoutedEventArgs e)
    {
        try
        {
            BindingOperations.ClearAllBindings(lboxProducts);
            dataset = dbWebservice.getDataFromTable(selectedTable);
            lboxProducts.ItemsSource = dataset.Tables[selectedTable].DefaultView;
            countProducts = 0;
            setLabels("0", "0.0");
            btnSort.IsEnabled = true;
            btnBuy.IsEnabled = true;
        }
        catch (Exception ex)
        {
            logger.WriteLine(applicationName, ex.Message);
        }
    }

None...

Теперь, когда пользователь нажимает кнопку «Купить» на кнопке, которую я хочу выбрать (еслиЛюбое выбрано) для размещения в списке или что-то еще, и зачитать ЦЕНУ.Так что я могу использовать это значение, чтобы назначить метку общей цены.Если пользователь нажимает еще раз, снова прочитайте цену из выбранного элемента и сложите ее с предыдущим пунктом.Просто так.Но я не могу получить какую-либо сюрприз, получить значения, «хранящиеся» в элементах списка, которые в основном являются объектами «Продукта».

В самом конце я хочу использовать «купленные и выбранные» предметы, для которых используются их идентификаторы.сохранить обратно в базу данных в tblOrders, поэтому мне нужны значения ID и PRICE.

Мое решение было примерно таким:

ClassObjects.Product product = (ClassObjects.Product)lboxProducts.SelectedItem;
            float price = product.Price;
            //go on and sum or store the price blabla

Но выдает ошибку, которую не может преобразовать изDataRowView для ClassObjects.Product ...

Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Вместо того, чтобы устанавливать itemSource для просмотра данных, вы всегда можете попробовать просмотреть строки, извлеченные из вашей базы данных, и создать объект Product для каждой возвращенной строки и поместить их в список. Затем установите источник данных в этот список. Затем, когда вы получите свой selectedItem, он будет иметь тип ClassObjects.Product, а не datarowview.

1 голос
/ 13 февраля 2012

Если вы используете DataTables, вы получите эти обертки, сначала приведите к DataRowView и получите продукт оттуда (используя, например, Item[String]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...