【发布时间】:2017-04-07 20:17:43
【问题描述】:
我问的问题基本上与this person 相同,但在较新的x:Bind 的上下文中。
ViewModels 的 DataContext 是这样定义的
<Page.DataContext>
<vm:ChapterPageViewModel x:Name="ViewModel" />
</Page.DataContext>
所以每当我需要绑定某些东西时,我都会像这样明确地将其绑定到 ViewModel
ItemsSource="{x:Bind ViewModel.pageList, Mode=OneWay}"
但是这在模板中不起作用
<FlipView ItemsSource="{x:Bind ViewModel.pageList, Mode=OneWay}">
<FlipView.ItemTemplate>
<DataTemplate x:DataType="models:Image">
<ScrollViewer SizeChanged="{x:Bind ViewModel.PageResized}"> <-- this here is the culprit
<Image Source="{x:Bind url}"/>
</ScrollViewer>
</DataTemplate>
</FlipView.ItemTemplate>
</FlipView>
阅读文档,我发现使用Path 应该基本上将上下文重置为页面,但这(x:Bind Path=ViewModel.PageResizeEvent 也不起作用。我仍然收到Object reference not set to an instance of an object,这应该意味着它没有'看不到方法(但为空)。
图像类:
public class Image {
public int page { get; set; }
public string url { get; set; }
public int width { get; set; }
public int heigth { get; set; }
}
在 ChapterPageViewModel 中
private List<Image> _pageList;
public List<Image> pageList {
get { return _pageList; }
set { Set(ref _pageList, value); }
}
public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode,
IDictionary<string, object> suspensionState)
{
Initialize();
await Task.CompletedTask;
}
private async void Initialize()
{
pageList = await ComicChapterGet.GetAsync(_chapterId);
}
public void PageResized(object sender, SizeChangedEventArgs e)
{
//resizing logic happens here
}
【问题讨论】:
-
models:Image 类是否有 ViewModel 属性?如果没有,并且您尝试引用绑定到
FlipView.ItemsSource的同一个 ViewModel,那么您将无法以这种方式访问它,因为 DataTemplate 的 DataContext 现在是一个模型:图像对象。 -
确实如此。如果我取出
SizeChanged="{x:Bind ViewModel.PageResized}",代码就可以工作。但是我需要能够在 ScrollView 的大小中调整图像的大小,这需要我从模板中访问 ViewModel 属性。 -
您介意添加该 Image 类的代码吗?
-
您是否尝试过使用旧的良好 Binding 而不是 x:Bind?
-
还有一个问题:即使那个 Image 类确实有一个 ViewModel 属性,你也不能像这样绑定两个事件。您应该改用EventTrigger and Command。但首先,添加 Image 类的代码,以便我们正确回答。