WP7 Binding Listbox для результата WCF - PullRequest
2 голосов
/ 17 марта 2011

У меня есть вызов WCF, который возвращает список объектов.

Я создал приложение WP7 Silverlight Pivot и изменил MainViewModel для загрузки данных из моей службы WCF, метод LoadData теперь выглядит следующим образом

public ObservableCollection<Standing> Items { get; private set; }

public void LoadData()
{
    var c = new WS.WSClient();
    c.GetStandingsCompleted += GetStandingsCompleted;
    c.GetStandingsAsync();            
}

void GetStandingsCompleted(object sender, GetStandingsCompletedEventArgs e)
{
    Items = e.Result;
    this.IsDataLoaded = true;
}

Это выполняется, и если я ставлю точку останова на завершенное событие, я вижу, что оно прошло успешно, и моя коллекция Предметов теперь содержит 50 нечетных элементов.Однако список в пользовательском интерфейсе не отображает их.

Если я добавлю следующую строку в конец моего метода LoadData, я вижу, что 1 элемент появляется в списке в пользовательском интерфейсе

Items.Add(new Standing(){Team="Test"});

Это доказывает, что привязки верны, но кажется, чтоиз-за задержки в вызове Asynch WCF пользовательский интерфейс не обновляется.

Для справки я обновил список MainPage.xaml, чтобы привязать его к свойству Team моего объекта Standing

<ListBox x:Name="FirstListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
          <StackPanel Margin="0,0,0,17" Width="432">
                <TextBlock Text="{Binding Team}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                <TextBlock Text="{Binding Team}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
          </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Есть идеи, что я делаю не так?

Спасибо

Ответы [ 2 ]

4 голосов
/ 18 марта 2011

Когда ваш ListBox создается впервые, его свойство ItemsSource принимает текущее значение Items, равное null. Когда ваш вызов WCF завершится, и вы назначите новое значение для Items, представление не сможет узнать, что значение этого свойства изменилось, если вы не запустили событие PropertyChanged, как упоминает Грег Циммерс в своем ответе.

Поскольку вы используете ObservableCollection, альтернативным методом будет первоначальное создание пустой коллекции, а затем добавление к ней объектов после завершения вызова WCF.

private ObservableCollection<Standing> _items = new ObservableCollection<Standing>();
public ObservableCollection<Standing> Items
{ 
  get { return _items; } 
  private set;
}


void GetStandingsCompleted(object sender, GetStandingsCompletedEventArgs e)
{
    foreach( var item in e.Result ) Items.Add( item );
    this.IsDataLoaded = true;
}
1 голос
/ 17 марта 2011

Реализует ли ваша сущность данных "Постоянный" интерфейс INotifyPropertyChanged, и вы вызываете событие измененного свойства?

...