如何在WPF中将数据从Web API正确绑定到ListBox?

时间:2017-04-13 15:49:16

标签: c# wpf listbox

我有一个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信息?

3 个答案:

答案 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