c# xaml windows-10 uwp compiled-bindings

c# - HubSection con enlace compilado



xaml windows-10 (1)

Estoy tratando de comprender las nuevas vinculaciones compiladas, pero al principio me detengo por este simple problema.

Tengo control Hub con una HubSection . El contenido de esta sección es un ItemsControl que debe unirse para ver la colección observable de los modelos. No puedo hacer que este enlace funcione como espero.

<Pivot x:Name="rootPivot" Style="{StaticResource TabsStylePivotStyle}"> <PivotItem> <Hub> <HubSection Header="News"> <DataTemplate x:DataType="local:HomePage"> <ItemsControl ItemsSource="{x:Bind ViewModel.NewsItems, Mode=OneWay}" />

ViewModel propiedad ViewModel es solo una propiedad y se ViewModel una instancia antes de la llamada a InitializeComponents() . NewsItems es una colección observable dentro del modelo de vista que se completa después de que la página se haya cargado, de forma asincrónica (solicitud web).

¿Qué estoy haciendo mal aquí?

EDITAR: código detrás

HomePage.xaml.cs

/// <summary> /// Home pag view. /// </summary> public sealed partial class HomePage : Page { /// <summary> /// Initializes a new instance of the <see cref="HomePage"/> class. /// </summary> public HomePage() { // Retrieve view model this.ViewModel = ViewModelResolver.Home; // Trigger view model loaded on page loaded this.Loaded += (sender, args) => this.ViewModel.LoadedAsync(); this.InitializeComponent(); } /// <summary> /// Gets the view model. /// </summary> /// <value> /// The view model. /// </value> public IHomeViewModel ViewModel { get; } }

HomePageViewModel.cs

/// <summary> /// Home view model. /// </summary> public sealed class HomeViewModel : IHomeViewModel { /// <summary> /// Occurs on page loaded. /// </summary> public async Task LoadedAsync() { // Retrieve news items var news = await new NewsService().GetNewsAsync(); foreach (var newsItem in news) this.NewsItems.Add(newsItem); } /// <summary> /// Gets the news items. /// </summary> /// <value> /// The news items. /// </value> public ObservableCollection<IFeedItem> NewsItems { get; } = new ObservableCollection<IFeedItem>(); }


Esta es de hecho una pregunta interesante. Supongo que el problema es que, a diferencia de DataTemplate típico como el siguiente (ver su ListView padre es vinculante para algunos datos conocidos Model.Items )

<ListView ItemsSource="{x:Bind Model.Items}"> <ListView.ItemTemplate> <DataTemplate x:DataType="model:Item"> <Grid> <TextBlock Text="{x:Bind Name}" /> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView>

sin embargo, su DataTemplate nivel superior no sabe de dónde provienen los datos.

Entonces, la solución es decirle a HubSection que vincule los datos correctos, en este caso, la instancia de HomePage.xaml.cs . Por lo tanto, intente agregar esto a su Hub

<Hub DataContext="{x:Bind}">

O simplemente agrega

this.InitializeComponent(); this.DataContext = this;

De cualquier forma, debería solucionar su problema.