为什么在 wpf 列表框中选择的值为空?

Why is selected value null in wpf listbox?

我已使用 entity framework 连接到数据库,并将汽车的品牌和型号以以下格式放入列表框中:品牌 - 型号。

当我 select 列表框中的一个项目时,我想获取该对象的 ID 以在另一个查询中使用它,该查询将在文本块中显示该特定汽车(数据库中的行)的完整详细信息.

当我 select 列表框中的项目时,它会在以下位置返回空值:

int id = (int)ltbxAvailableCars.SelectedValue;

在XAML中,我指定了:

Listbox SelectedValuePath="ID"

这里有没有我没有看到的明显错误?

提前致谢。

public partial class MainWindow : Window
{
    CarRentalDBEntities db = new CarRentalDBEntities();

    public enum CarType { All, Small, Medium, Large }

    public MainWindow()
    {
        InitializeComponent();

        cbxCarType.ItemsSource = Enum.GetValues(typeof(CarType));
    }

    private void btnSearch_Click(object sender, RoutedEventArgs e)
    {
        CarType type;
        Enum.TryParse<CarType>(cbxCarType.SelectedValue.ToString(), out type);

        string carType = type.ToString();

        if (carType == "All")
        {
            ltbxAvailableCars.Items.Clear();
            var cars = from c in db.Cars
                       select new
                       {
                           c.ID,
                           c.Make,
                           c.Model,
                           c.Size
                       };

            foreach (var car in cars)
            {
                ltbxAvailableCars.Items.Add(car.Make + " - " + car.Model);
            }
        }
        else
        {
            ltbxAvailableCars.Items.Clear();
            var cars = from c in db.Cars
                       where c.Size == carType
                       select new
                       {
                           c.ID,
                           c.Make,
                           c.Model,
                           c.Size
                       };

            foreach (var car in cars)
            {
                ltbxAvailableCars.Items.Add(car.Make + " - " + car.Model);
            }
        }  
    }

    private void ltbxAvailableCars_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int id = (int)ltbxAvailableCars.SelectedValue;

        CarRentalDBEntities db = new CarRentalDBEntities();

        var query = from c in db.Cars
                    where c.ID == id
                    select new
                    {
                        c.ID,
                        c.Make,
                        c.Model,
                        c.Size
                    };

        tblkSelectedCarDetails.Text = query.ToString();
    }
}

根据您的情况,您可以尝试使用 e.AddedItems(传递给您的方法的参数 ltbxAvailableCars_SelectionChanged)并从中提取值,详见 MSDN 在线:https://msdn.microsoft.com/en-us/library/system.windows.controls.selectionchangedeventargs%28v=vs.110%29.aspx 希望这可能有所帮助。最好的问候,

这是针对您的案例的方法。但在我看来,你提到的 ObservableCollection 数据绑定似乎更优雅,甚至更容易
创建 class 以在列表框项目

中保留所需的值
public class Car
{
    public Int32 ID { get; set; }
    public DateTime Make { get; set; }
    public String Model { get; set; }

    public override string ToString()
    {
       return String.Format("{0} - {1}", this.Make, this.Model);
    }
}

ToString 将被覆盖并且 return 您想要显示在列表框中的字符串。
ListBox 调用 .ToString() 显示文本项的方法

然后在 LINQ 查询中创建 class 的实例并将它们添加到列表框

ltbxAvailableCars.Items.Clear();
var cars = from c in db.Cars
           where c.Size == carType
           select new Car
           {
               ID = c.ID,
               Make = c.Make,
               Model = c.Model
           };

foreach (Car car in cars)
{
    ltbxAvailableCars.Items.Add(car);
}

并在 SelectionChanged 事件处理程序中使用它

private void ltbxAvailableCars_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Car temp = (Car)ltbxAvailableCars.SelectedItem;
    Int32 id = temp.ID
    CarRentalDBEntities db = new CarRentalDBEntities();

    var query = from c in db.Cars
                where c.ID == id
                select new
                {
                    c.ID,
                    c.Make,
                    c.Model,
                    c.Size
                };

    tblkSelectedCarDetails.Text = query.ToString();
}