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.