具有已编译绑定的 HubSection
HubSection with compiled binding
我试图掌握新的编译绑定,但一开始我就被这个简单的问题打断了。
我 Hub
控制了一个 HubSection
。这部分的内容是一个 ItemsControl
需要绑定到视图模型的可观察集合。我无法使此绑定按预期工作。
<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
属性 只是一个 属性 并在 InitializeComponents()
调用之前实例化。 NewsItems
是在页面加载后填充的视图模型中的可观察集合 - 异步(网络请求)。
我做错了什么?
编辑:代码隐藏
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>();
}
这确实是一个有趣的问题。我想问题是,不像典型的 DataTemplate
像下面这样(看到它的父 ListView
绑定到一些已知数据 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>
你的最高水平DataTemplate
然而,不知道数据来自哪里。
因此解决方法是告诉 HubSection
绑定正确的数据 - 在本例中为 HomePage.xaml.cs
实例。所以,尝试将此添加到您的 Hub
<Hub DataContext="{x:Bind}">
或直接添加
this.InitializeComponent();
this.DataContext = this;
任何一种方法都可以解决您的问题。
我试图掌握新的编译绑定,但一开始我就被这个简单的问题打断了。
我 Hub
控制了一个 HubSection
。这部分的内容是一个 ItemsControl
需要绑定到视图模型的可观察集合。我无法使此绑定按预期工作。
<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
属性 只是一个 属性 并在 InitializeComponents()
调用之前实例化。 NewsItems
是在页面加载后填充的视图模型中的可观察集合 - 异步(网络请求)。
我做错了什么?
编辑:代码隐藏
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>();
}
这确实是一个有趣的问题。我想问题是,不像典型的 DataTemplate
像下面这样(看到它的父 ListView
绑定到一些已知数据 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>
你的最高水平DataTemplate
然而,不知道数据来自哪里。
因此解决方法是告诉 HubSection
绑定正确的数据 - 在本例中为 HomePage.xaml.cs
实例。所以,尝试将此添加到您的 Hub
<Hub DataContext="{x:Bind}">
或直接添加
this.InitializeComponent();
this.DataContext = this;
任何一种方法都可以解决您的问题。