WP7将列表框绑定到WCF结果

时间:2011-03-17 20:18:44

标签: wcf data-binding windows-phone-7

我有一个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;
}

这会运行,如果我在已完成的事件上设置了一个断点,我可以看到它成功运行,我的Items集合现在有50个奇数项目。但是,UI中的列表框不会显示这些内容。

如果我将以下行添加到我的LoadData方法的底部,那么我看到UI上的listbx中出现了1个项目

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

这证明绑定是正确的,但似乎由于Asynch WCF调用的延迟,UI不会更新。

作为参考我已更新MainPage.xaml列表框以绑定到我的常驻对象上的Team属性

<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 个答案:

答案 0 :(得分:4)

首次创建ListBox时,其ItemsSource属性的当前值为Items null。当你的WCF调用完成并为Items分配一个新值时,如果没有你发起PropertyChanged事件,视图无法知道该属性的值已经改变,正如Greg Zimmers在他的提及中所提到的那样回答。

由于你正在使用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 :(得分:1)

您的数据实体“Standing”是否实现了INotifyPropertyChanged接口并且您是否提升了属性更改事件?