x:将ViewModel方法绑定到DataTemplate中的事件ViewModels的DataContext定义如下所以每当我需要绑定某些东西时,我都会明确地对ViewModelItemsSource=“{x:BindViewModel.pageList,Mode=OneWay}”执行此操作但是,这在模板中不起作用有效<--这是罪魁祸首阅读文档,我发现使用Path基本上应该将上下文重置为页面,但是这个(x:BindPath=ViewModel.PageResizeEvent也不起作用。我仍然没有得到对象引用设置为object的实例,这应该意味着它看不到该方法(但为null)。图片类:publicclassImage{publicintpage{get;放;}公共字符串url{得到;放;}publicintwidth{get;放;}publicintheight{得到;放;}}和ChapterPageViewModel_pageList中的私有列表;公共列表pageList{get{return_pageList;}set{Set(ref_pageList,value);}}publicoverrideasyncTaskOnNavigatedToAsync(objectparameter,NavigationModemode,IDictionarysuspensionState){Initialize();等待Task.Completed}Task;privateasyncvoidInitialize(){pageList=awaitComicChapterGet.GetAsync(_chapterId);}publicvoidPageResized(objectsender,SizeChangedEventArgse){//调整大小的逻辑发生在这里}我们这里有两个问题:首先,尝试直接绑定事件将委托分配给事件处理程序仅仅意味着这将永远行不通。在MVVM模式中处理事件的一种方法是使用EventTrigger和ICommand。它需要一个实现ICommand的类。如果您不知道该怎么做,本文将对您有所帮助。我会调用我的DelegateCommand。以下是我将如何分两步重构它:1)向VM添加命令:}publicDelegateCommandPageResizedCommand{get;}privatevoidOnPageResized(){}}2)使用EventTrigger和InvokeCommandAction将命令绑定到SizeChanged事件。(...)“但是??加布里埃尔”,你说,“那是行不通的!”我知道!这是因为第二个问题,它试图x:bind一个不属于DataTemplate类的属性这与这个问题密切相关,所以我将从那里借用一些信息。来自MSDN,关于DataTemplate和x:BindInsideaDataTemplate(whetherusedasanitemtemplate,contenttemplateorheadertemplate),Path的值不是在页面的上下文中解释的,而是在数据对象的上下文中解释的templated在中解释。为了在编译时验证其绑定(并为其生成有效代码),DataTemplate需要使用x:DataType声明其数据对象的类型。因此,当您执行a时,您实际上是在该模型上搜索名为ViewModel的属性models:Image类:Image,它是DataTemplate的x:DataType。该类不存在此类属性。在这里我可以看到两个选项。选择一个:将ViewModel添加为Image类的属性并将其填充到VM上。publicclassImage{(...)publicChapterPageViewModelViewModel{get;放;}}publicclassChapterPageViewModel{(...)privateasyncvoidInitialize(){pageList=awaitComicChapterGet.GetAsync(_chapterId);foreach(页面列表中的图像img)img.ViewModel=this;仅此而已,之前的代码应该可以工作,无需更改任何其他内容。删除x:绑定并返回到与ElementName的良好绑定。这种方式违背了你的问题的目的,但它有效,而且比以前更容易。以上就是C#学习教程:x:将ViewModel方法绑定到DataTemplate中的Event,分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
