2017-10-28 87 views
0

我已经创建了用于演示此问题的示例应用程序。 对不起,它很难把所有的代码放在这里,因为有模型类,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()); 
} 

回答

1

您的PlaceList属性需要触发通知以让绑定知道有变化。因为,当您替换_placeList时,您不会通知任何人PlaceList发生更改,因此没有任何更新。此处的典型模式是将PlaceList属性初始化为只读,然后将事物添加到现有集合中,而不是将集合交换出去,尽管如果您通知您已交换了也应该工作的集合。

此外,PlaceList中的IEnumerable需要在其内容更改时提供通知。执行此操作的标准方法是使其成为ObservableCollection,因为OC为您实现INotifyPropertyChanged和INotifyCollectionChanged。查看Binding to collections快速入门

+0

是的,我试着改变ObservableCollection,但仍然无法正常工作。从提供的示例中,如果看到MainPage.xaml.cs文件使用了相同的概念,并在那里使用splitview中的绑定列表视图。 – Sharath

+0

这只是它的一半。您还需要通知您已更改收藏集。查看更新的文本 –

相关问题