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