Трудно связать массив объектов из вызова веб-сервиса со списком wpf - PullRequest
0 голосов
/ 11 мая 2010

я запустил приложение WPF (с версией 2008 sp1), которое подключается к веб-службе для получения коллекции объектов. Я могу быть contactInfo[] или groupInfo[]. вот мой main.xaml.cs

 public main()
    {
        InitializeComponent();
        //service.addContactCompleted +=new addContactCompletedEventHandler(addContactCompleted);
        service.getContactsCompleted += new getContactsCompletedEventHandler(getContactsCompleted);
        fillContents();
    }

private void getContactsCompleted(object sender, getContactsCompletedEventArgs e)
    {
        try
        {
            //e.Result return contactInfo[]
            contactListBox.ItemsSource = e.Result;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }


    public void fillContents()
    {
        service.getContactsAsync(session.key, null);


    }

а это мой main.xaml

 <Window.Resources>
    <ObjectDataProvider x:Key="contactInfo" ObjectType="{x:Type serviceAdmin:contactInfo}" />
</Window.Resources>
<Grid>
                <ListBox Margin="-146,-124,-143,-118.808" Name="contactListBox" ItemsSource="{Binding Source={StaticResource contactInfo}}" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Label Content="{Binding fullName}"/>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
                <!--<toolkit:DataGrid Margin="-146,-124,-150,-118.808" Name="contactGrid"  ItemsSource="{Binding}"/>-->
</Grid>

это частично работает, но только то, что возвращает повторяющиеся значения. это просто повторяется, что когда-либо на первом месте. Я хотел бы знать, что я делаю здесь неправильно. Может кто-нибудь пролить свет ?? спасибо за чтение этого !!

1 Ответ

1 голос
/ 12 мая 2010

Похоже, вы привязываете свой ListBox к неверному источнику. Прежде всего, я не совсем понимаю, зачем вам вообще нужен ObjectDataSource. Вы можете просто привязать ItemsSource ListBox к вашей коллекции, как вы это сделали. Но также (как отметил комментатор), имейте в виду, что вы обращаетесь к пользовательскому интерфейсу в другом потоке, поэтому вы должны использовать вызовы Dispatcher для заполнения списка. Может быть, что-то вроде этого:

 public main()
{
    InitializeComponent();
    service.getContactsCompleted += new getContactsCompletedEventHandler(getContactsCompleted);
    fillContents();
}

private void getContactsCompleted(object sender, getContactsCompletedEventArgs e)
{
    try
    {
        //e.Result return contactInfo[]
        Dispatcher.Invoke(new Action<List<contactInfo>>(list => contactListBox.ItemsSource = list), e.Result);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

public void fillContents()
{
    service.getContactsAsync(session.key, null);
}

Ваш xaml может быть значительно упрощен до этого:

<Grid>
   <ListBox Margin="-146,-124,-143,-118.808" Name="contactListBox" DisplayMember="fullName" />
</Grid>

НТН,
Рул

...