C# 如何将Web API中的数据正确绑定到WPF中的ListBox?

C# 如何将Web API中的数据正确绑定到WPF中的ListBox?,c#,wpf,listbox,C#,Wpf,Listbox,我有一个ASP.NETWebAPI,根据我的测试,它可以正常工作。现在,我想在一个简单的WPF应用程序中使用它。我只想从API获取数据,在客户端应用程序中显示数据,然后使用客户端应用程序从数据库中添加或删除数据 我的问题是,当我将数据传递到列表框时,我会丢失一些信息,特别是我丢失了对象的Id,我需要它来从数据库中删除它。在我的场景中,我的一个页面中有类似的内容: <ListBox Name="carCategoryListBox" Grid.Row="2" Grid

我有一个ASP.NETWebAPI,根据我的测试,它可以正常工作。现在,我想在一个简单的WPF应用程序中使用它。我只想从API获取数据,在客户端应用程序中显示数据,然后使用客户端应用程序从数据库中添加或删除数据

我的问题是,当我将数据传递到
列表框时,我会丢失一些信息,特别是我丢失了对象的
Id
,我需要它来从数据库中删除它。在我的场景中,我的一个页面中有类似的内容:

<ListBox
    Name="carCategoryListBox"
    Grid.Row="2"
    Grid.Column="1" />
如您所见,我只需获取对象的
类别
字段,并将它们传递到要显示的
列表框
CarCategory
类非常简单,如下所示:

public class CarCategory
{
    public int Id { get; set; }

    public string Category { get; set; }
}
问题是,在稍后的阶段,我需要获取对象的实际
Id
,并使用它。但是,由于我只将
Category
字段传递给
ListBox
,因此在我的例子中,这个
Id
信息不知何故丢失了。如果我这样做:

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    BindCarCategoryList();
}

private async void BindCarCategoryList()
{
    var client = CarHttpClient.GetClient();

    HttpResponseMessage response = await client.GetAsync("api/carcategories");

    if (response.IsSuccessStatusCode)
    {
        var content = await response.Content.ReadAsStringAsync();
        var carCategories = JsonConvert.DeserializeObject<List<DTO.CarCategory>>(content);

        carCategoryListBox.ItemsSource = carCategories.Select(cc => cc.Category).ToList();
    }
    else
    {
        MessageBox.Show("Error code " + response.StatusCode + "\nMessage - " + response.ReasonPhrase);
        return;
    }
}
int id = carCategoryListBox.SelectedIndex;

然后,我只获取
列表框中项目的
Id
(它在列表中的哪个项目),实际上我没有获取存储在数据库中的对象的原始
Id
。您知道如何将数据传递到
列表框
,以某种方式使我仍然保留原始的
Id
信息吗?

您应该绑定整个对象,而不仅仅是从中选择一个字段,并将列表框的DisplayMemberPath设置为“类别”。然后,您选择的项目将是整个CarCategory,您可以获取其ID


您还应该了解MVVM并尽可能接近这些概念,它们确实很有帮助。

列表框。SelectedIndex
是所选项目在ItemsSource中的位置。如果没有选定的项目,它甚至可以是-1。并且它与
Id

要获取数据绑定对象,请进行一些更改:

1) 使用
列表
作为项目来源:

carCategoryListBox.ItemsSource = carCategories;
2) 将ListBox.DisplayMemberPath设置为显示类别名称:

<ListBox DisplayMemberPath="Category"
    Name="carCategoryListBox"
    Grid.Row="2"
    Grid.Column="1" />

您必须更改BindCarCategoryList

carCategoryListBox.ItemsSource = carCategories.Select(cc => cc.Category).ToList();

然后像这样修改您的xaml

<ComboBox Grid.Row="2" Grid.Column="1" Margin="4" Width="250" DisplayMemberPath="Category" DisplayMemberPath="Id" />

或者,如果不使用MVVM,请直接在.cs文件中分配DisplayMemberPath和DisplayMemberPath

carCategoryListBox.ItemsSource = carCategories;
<ComboBox Grid.Row="2" Grid.Column="1" Margin="4" Width="250" DisplayMemberPath="Category" DisplayMemberPath="Id" />