WPF 에서 WebApi 사용하기
Model
public class Item
{
public string Id { get; set; }
public string Name { get; set; }
}
WebAPI
public class ItemController : ApiController
{
Item[] items = new Item[]
{
new Item { Id = "google", Name = "Google" },
new Item { Id = "naver", Name = "Naver" },
new Item { Id = "daum", Name = "Daum" }
};
public IEnumerable<Item> GetAllItems()
{
return items;
}
}
WPF ObservableCollection
public class ItemCollection : ObservableCollection<Item>
{
public void CopyFrom(IEnumerable<Item> items)
{
this.Items.Clear();
foreach (var p in items)
{
this.Items.Add(p);
}
this.OnCollectionChanged(
new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
WPF View
<StackPanel Width="250" >
<Button Name="getAllItemsButton" Click="GetItems">Get Items</Button>
<ListBox Name="ItemsList">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="2">
<TextBlock >Id: <Run Text="{Binding Path=Id}" /></TextBlock>
<TextBlock >Name: <Run Text="{Binding Path=Name}" /></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
WPF Code
비동기 호출을 사용하여 사용자 응답성을 향상 시킨다.
public partial class MainWindow : Window
{
HttpClient client = new HttpClient();
ItemCollection items = new ItemCollection();
public MainWindow()
{
InitializeComponent();
client.BaseAddress = new Uri("http://localhost:59791");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
this.ItemsList.ItemsSource = this.items;
}
private async void GetItems(object sender, RoutedEventArgs e)
{
try
{
this.getAllItemsButton.IsEnabled = false;
var response = await client.GetAsync("api/item/getallitems");
response.EnsureSuccessStatusCode();
var items = await response.Content.ReadAsAsync<IEnumerable<Item>>();
this.items.CopyFrom(items);
}
catch (Newtonsoft.Json.JsonException jEx)
{
MessageBox.Show(jEx.Message);
}
catch (HttpRequestException ex)
{
MessageBox.Show(ex.Message);
}
finally
{
this.getAllItemsButton.IsEnabled = true;
}
}
}
댓글 없음:
댓글 쓰기