2017/06/27

WPF 에서 WebApi 사용하기

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;
        }
    }
}

댓글 없음:

댓글 쓰기

C# 문자열 포함 여부 확인하기.

ToUpper() 를 사용하면 불필요한 문자열을 생성하므로 좋은 방법은 아니다. string text = "This is an apple." ; string apple = "Apple." ; bool ...