我有一个ASP.NET Web API,根据我的测试,它可以正常工作。现在,我想在一个简单的WPF应用程序中使用它。我只想从API获取数据,在客户端应用程序中显示它,然后只使用客户端应用程序从数据库中添加或删除数据。
我的问题是,当我将数据传递给ListBox
时,我会丢失信息,特别是我丢失了对象的Id
,我稍后需要将其从数据库。在我的场景中,我的一个页面中有类似的内容:
<ListBox
Name="carCategoryListBox"
Grid.Row="2"
Grid.Column="1" />
然后,在页面的.cs
文件中,我执行以下操作:
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;
}
}
正如您所看到的,我只是获取了对象的Category
字段,并将它们传递给ListBox
进行显示。 CarCategory
类非常简单,可以在下面看到:
public class CarCategory
{
public int Id { get; set; }
public string Category { get; set; }
}
问题是,在稍后阶段我需要获取对象的实际Id
并使用它。但是,由于我只将Category
字段传递给ListBox
,因此在我的情况下,此Id
信息会丢失。如果我做这样的事情:
int id = carCategoryListBox.SelectedIndex;
然后,我只是获取Id
中项目的ListBox
(它在列表中的哪个项目),我实际上并没有得到对象的原始Id
存储在数据库中。是否有任何想法如何将数据传递给ListBox
,以便我仍以某种方式保留原始Id
信息?
答案 0 :(得分:1)
ListBox.SelectedIndex
是ItemsSource中所选项目的位置。如果没有选定的项目,它甚至可以是-1。它与Id
获取数据绑定对象进行一些更改:
1)使用List<CarCategory>
作为ItemsSource:
carCategoryListBox.ItemsSource = carCategories;
2)为它设置ListBox.DisplayMemberPath以显示类别名称:
<ListBox DisplayMemberPath="Category"
Name="carCategoryListBox"
Grid.Row="2"
Grid.Column="1" />
3)使用SelectedItem
属性获取所选项目(可以是null
):
var category = (CarCategory)carCategoryListBox.SelectedItem;
答案 1 :(得分:0)
您应该绑定整个对象而不是仅从中选择一个字段,并将列表框的DisplayMemberPath设置为&#39; Category&#39;。然后,您选择的项目将是整个CarCategory,您可以获取其ID。
你也应该看一下MVVM并尝试尽可能接近概念,他们真的很有帮助。
答案 2 :(得分:0)
您必须更改BindCarCategoryList
carCategoryListBox.ItemsSource = carCategories.Select(cc => cc.Category).ToList();
到
carCategoryListBox.ItemsSource = carCategories;
并像这样修改你的xaml
<ComboBox Grid.Row="2" Grid.Column="1" Margin="4" Width="250" DisplayMemberPath="Category" DisplayMemberPath="Id" />
或者如果你不使用MVVM直接在你的.cs文件中分配DisplayMemberPath和DisplayMemberPath