我有一个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>
关于我做错的任何想法?
由于
答案 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接口并且您是否提升了属性更改事件?