无法绑定到Windows 10应用程序中的列表视图(UWP)
问题描述:
我已经创建了用于演示此问题的示例应用程序。 对不起,它很难把所有的代码放在这里,因为有模型类,datamodel,服务文件,从rest api提取数据。无法绑定到Windows 10应用程序中的列表视图(UWP)
所以只有很少的文件被包含在信息中。
_placeList = await DataModel.PlaceDataSource.GetData(url);来自PlacePage.xaml.cs文件的这条语句实际上是获取记录,但不会被绑定并显示在listview中。
但是gridViewPlaces.ItemsSource =等待DataModel.PlaceDataSource.GetData(url);作品。
你可以在这里找到源代码。 Project Download Link
MainPage.xaml中
<SplitView x:Name="splitView" IsPaneOpen="True" OpenPaneLength="250" Grid.Row="1" DisplayMode="Inline">
<SplitView.Pane>
...
</SplitView.Pane>
<SplitView.Content>
<Grid>
<Frame x:Name="rootFrame" />
</Grid>
</SplitView.Content>
</SplitView>
PlacePage.xaml
<GridView Name="gridViewPlaces" ItemsSource="{x:Bind PlaceList}" SelectionMode="Single">
<GridView.ItemTemplate>
<DataTemplate>
<Grid Width="200" Height="Auto">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Key" />
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Name}" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="Value" />
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Value}" />
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
PagePage.xaml.cs文件
private IEnumerable<Place> _placeList;
public IEnumerable<Place> PlaceList
{
get { return _placeList; }
}
public event EventHandler GroupsLoaded;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
url = e.Parameter.ToString();
LoadPlaces();
}
async private void LoadPlaces()
{
_placeList = await DataModel.PlaceDataSource.GetData(url);
//gridViewPlaces.ItemsSource = await DataModel.PlaceDataSource.GetData(url); // This works
gridViewPlaces.UpdateLayout();
if (GroupsLoaded != null)
GroupsLoaded(this, new EventArgs());
}
答
您的PlaceList属性需要触发通知以让绑定知道有变化。因为,当您替换_placeList时,您不会通知任何人PlaceList发生更改,因此没有任何更新。此处的典型模式是将PlaceList属性初始化为只读,然后将事物添加到现有集合中,而不是将集合交换出去,尽管如果您通知您已交换了也应该工作的集合。
此外,PlaceList中的IEnumerable需要在其内容更改时提供通知。执行此操作的标准方法是使其成为ObservableCollection,因为OC为您实现INotifyPropertyChanged和INotifyCollectionChanged。查看Binding to collections快速入门
是的,我试着改变ObservableCollection,但仍然无法正常工作。从提供的示例中,如果看到MainPage.xaml.cs文件使用了相同的概念,并在那里使用splitview中的绑定列表视图。 – Sharath
这只是它的一半。您还需要通知您已更改收藏集。查看更新的文本 –