我基本上提出了与this person相同的问题,但在更新的x:Bind
的上下文中。x:将ViewModel方法绑定到DataTemplate中的事件
的ViewModels' DataContext的定义,像这样
<Page.DataContext>
<vm:ChapterPageViewModel x:Name="ViewModel" />
</Page.DataContext>
所以每当我需要绑定的东西我做明确地向视图模型,像这样
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
}
那个模型:Image类有一个ViewModel属性吗?如果不是,并且您试图引用与“FlipView.ItemsSource”绑定的相同ViewModel,那么您将无法以这种方式访问它,因为DataTemplate的DataContext现在是模型:Image目的。 –
它的确如此。如果我取出SizeChanged =“{x:Bind ViewModel.PageResized}”,代码将起作用。但我需要能够调整ScrollView大小的图像大小,这需要我从模板中访问ViewModel属性。 – rancor1223
你介意添加该Image类的代码吗? –