如何从GridViewItem Tap事件(XAML)执行命令
我试图在我的
Windows 8.1商店应用程序(XAML)中遵循MVVM模式.
当在UI中点击/点击GridViewItem时,我想导航到一个新的视图.我想做到这一点没有代码背后的事件来提升可测试性(使用MVVM Light). 为了允许我的UI绑定到视图模型命令,我一直在看通过添加引用添加的Microsoft行为SDK(XAML) – > Windows – >扩展. 当我点击网格视图项目时,我的视图中的以下代码会编译,但会弹出.不幸的是,它几乎没有帮助只是抛出一个未处理的win32异常[3476]. 有人可以帮忙解释一下这个问题吗? 使用的命名空间是 xmlns:interactivity="using:Microsoft.Xaml.Interactivity" xmlns:core="using:Microsoft.Xaml.Interactions.Core" <GridView x:Name="itemGridView" AutomationProperties.AutomationId="ItemGridView" AutomationProperties.Name="Grouped Items" ItemsSource="{Binding Source={StaticResource GroupedSource}}" IsSwipeEnabled="True" IsTapEnabled="True"> <GridView.ItemTemplate> <DataTemplate> <Grid Margin="0" Height="230"> <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch"> <Image Source="{Binding Image}" Stretch="UniformToFill" HorizontalAlignment="Center" VerticalAlignment="Center" /> <StackPanel VerticalAlignment="Bottom" Height="45" Margin="0,-45,0"> <StackPanel.Background> <SolidColorBrush Color="Black" Opacity="0.75" /> </StackPanel.Background> <TextBlock FontSize="16" Margin="2" Text="{Binding Name}" TextWrapping="Wrap" VerticalAlignment="Bottom" /> </StackPanel> </StackPanel> <interactivity:Interaction.Behaviors> <core:EventTriggerBehavior EventName="Tapped"> <core:InvokeCommandAction Command="{Binding DataContext.SummaryCatagorySelectedCommand,ElementName=LayoutRoot}" /> </core:EventTriggerBehavior> </interactivity:Interaction.Behaviors> </Grid> </DataTemplate> </GridView.ItemTemplate> 编辑.根据要求,我添加了视图模型,其中包含了我要从我的行为中触发的命令. public class ViewModel : ViewModelBase { public RelayCommand<string> SummaryCatagorySelectedCommand { get; set; } public ViewModel() { // } }
最简单的答案是告诉你,在这种情况下你不应该使用命令.首先,命令的值是它执行并传送回无法执行到交互式XAML控件.例如,当命令不可用时,按钮被禁用.
但是,由于您正在使用一个框架元素的轻击事件,您基本上只是使用控件,就像它是一个简单的方法,而不是一个命令.当然,您的视图模型可以同时具有命令和方法.而行为可以调用命令和方法. 为此,您解决方案的最佳场景是通过在视图模型中调用命令来改变方法.您的困难是1.命令超出了数据模板的范围,并且2.命令参数在范围外的线程上下文中传递. 这是我建议使你的生活更轻松,你的应用程序更简单. 不要附加到项目的轻敲事件.而是附加到gridview的itemclicked事件.这当然意味着您需要在GridView中将IsItemClickEnabled设置为true.那么不要调用命令,这是你不使用的开销,而是调用一个方法. 这是您的viewmodel中的方法看起来像: public async void ClickCommand(object sender,object parameter) { var arg = parameter as Windows.UI.Xaml.Controls.ItemClickEventArgs; var item = arg.ClickedItem as Models.Item; await new MessageDialog(item.Text).ShowAsync() } 该方法的名称并不重要(我甚至称之为命令来指出),但签名确实如此.行为框架正在寻找一个零参数或两个对象类型参数的方法.方便的是,两个参数版本将事件签名转发给它.在这种情况下,这意味着您可以使用包含点击的项目的ItemClickEventArgs.很简单. 您的gridview也被简化了.您可以简单地将gridview的自然范围引用到外部视图模型,而不是将范围强制在数据上下文中.它看起来像这样: <GridView Margin="0,140,0" Padding="120,0" SelectionMode="None" ItemsSource="{Binding Items}" IsItemClickEnabled="True"> <Interactivity:Interaction.Behaviors> <Core:EventTriggerBehavior EventName="ItemClick"> <Core:CallMethodAction MethodName="ClickCommand" TargetObject="{Binding Mode=OneWay}" /> </Core:EventTriggerBehavior> </Interactivity:Interaction.Behaviors> 这是一个更简单的解决方案,并且不违反MVVM模式中的任何内容,因为它仍然将逻辑推送到您的分离和可测试的viewmodel.它允许您有效地使用行为作为事件到命令,但实际上使用更简单的事件到方法模式.由于行为并没有将CanExecute值传递回控件,所以实际上也简化了您的viewmodel. 如果,事实证明你想要做的是重新使用已经在其他地方利用的现有命令(这听起来像1%的边缘情况),你可以随时为此创建一个shell方法,以便内部利用该命令. 作为警告,Windows 8.1附带的RelayCommand没有正确实现ICommand,因为它不会在执行Execute之前首先测试CanExecute.此外,类型化的RelayCommand中的CanExecute逻辑不会将CommandParameter传递给处理程序.这些都不重要,这取决于你是谁先使用命令.对我来说很重要. 所以,这是你的答案.更改为GridView.ItemClicked,并从ViewModel.Command更改为ViewModel.Method.如果您希望重用您的数据模板,这将使您的生活更轻松,更容易,并使您的XAML更具便携性. 祝你好运! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Windows DFS如何为远离办公室的笔记本电脑工作?
- 命令行 – 为什么Windows命令shell告诉我使用不同的命令然后
- windows-vista – 获取Vista Ultimate 64位的HDD(和NOT Vol
- windows – 草莓Perl libeay32_.dll问题
- [Windows]关于 Windows 7 降级使用 Windows XP
- windows-server-2008 – iSCSI SAN仍然是集群中的spof?它可
- windows系统编辑过的脚本文件,在linxu上执行报错 /bin/sh^
- iis-7 – Win 2008 R2上的IIS 7默认情况下不显示图像
- 托管和非托管DLL之间有什么区别
- 从非交互式进程(Windows服务,计划任务等)在WinServer 2008中
- tinymce-3 – TypeError:window.tinyMCE.execIn
- 如何在Windows上自动找到损坏的符号链接?
- 构建可以在Windows和OS X上运行的.NET应用程序的
- localhost – RawCap错误:“无法进入混杂模式(R
- win10 安装msi 提示2502、2503的错误代码(已成功
- windows – 如何更改Mercurial中的默认修订版?
- .net – 以编程方式使用“Microsoft另存为PDF”加
- Windows – 如何使用DoEvents()而不是“邪恶”?
- windows-server-2003 – Windows Server 2003中的
- 远程桌面,身份验证错误:要求的函数不正确等解决