2017-04-13 118 views
0

我有一个ASP.NET Web API,它可以根据我的测试正常工作。现在,我想在一个简单的WPF应用程序中使用它。我只想从API获取数据,将其显示在客户端应用程序中,然后使用客户端应用程序添加或删除数据库中的数据。如何正确地将数据从Web API绑定到WPF中的ListBox?

我的问题是,当我将数据传递给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; 

然后,我只是得到该项目的IdListBox(这是在列表中哪个项目),我不实际获得对象的原始Id那存储在数据库中。任何想法如何将数据传递给ListBox以便我仍然以某种方式保留原始Id信息?

回答

1

ListBox.SelectedIndex是ItemsSource中所选项目的位置。如果没有选择的项目,它甚至可以是-1。它是不一样的价值Id

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

1)使用List<CarCategory>为的ItemsSource:

carCategoryListBox.ItemsSource = carCategories; 

2)设置列表框。的DisplayMemberPath它显示的类别名称:

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

3)使用SelectedItem属性来获取选定项(可null):

var category = (CarCategory)carCategoryListBox.SelectedItem; 
+0

谢谢,它工作得很好。 – typos

0

您应该绑定整个对象而不是只从中选择一个字段,并将列表框的DisplayMemberPath设置为'Category'。然后,您选择的项目将成为整个CarCategory,并且您可以获得其ID。

您还应该看看MVVM,并尽可能接近概念,他们真的帮助。

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分配的DisplayMemberPath和的DisplayMemberPath直接在您的.cs文件

相关问题