GridView能否不定义DataType?如何将项内按钮绑定到ViewModel命令?
GridView项内绑定ViewModel命令及DataType相关问题
一、将Button绑定到ViewModel的ICommand
由于DataTemplate的上下文是GameModel实例,要绑定到ViewModel的命令,需要明确指定绑定来源,以下是两种常用实现方式:
方法1:通过RelativeSource向上查找GridView的DataContext
利用RelativeSource定位父级GridView控件,它的DataContext就是你的ViewModel,直接绑定ViewModel中的命令即可:
<Button Command="{x:Bind DataContext.YourCommandName, RelativeSource={RelativeSource AncestorType=GridView}, Mode=OneWay}"/>
将YourCommandName替换为ViewModel中实际的ICommand属性名,Mode=OneWay是命令绑定的常规配置,无需双向绑定。
方法2:给GridView命名后用ElementName绑定
先给GridView添加x:Name属性:
<GridView x:Name="GameGridView" ItemClick="{x:Bind ViewModel.GridView_ItemClick}" ItemsSource="{x:Bind ViewModel.GridViewGames, Mode=OneWay}">
然后Button的绑定直接引用GridView的DataContext:
<Button Command="{x:Bind GameGridView.DataContext.YourCommandName, Mode=OneWay}"/>
这种方式更直观,只要GridView的DataContext关联了ViewModel(你的代码已通过x:Bind ViewModel.xxx实现关联),就能正常绑定。
二、是否可以不给GridView定义DataType?
GridView本身不需要指定DataType,只有DataTemplate的x:DataType是可选配置:
- 保留
x:DataType="models:GameModel"时,可获得编译时类型检查和IDE智能提示,绑定错误会在编译阶段暴露,推荐保留该配置。 - 去掉DataTemplate的
x:DataType后,绑定会退化为运行时绑定,依然可以正常工作,但会失去编译时的类型校验和智能提示,编写代码时没有属性名自动补全。
去掉x:DataType后的DataTemplate示例:
<DataTemplate> <ScrollViewer VerticalScrollBarVisibility="Visible"> <StackPanel Orientation="Vertical"> <TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{Binding Name}" /> <TextBlock Style="{StaticResource BodyTextBlockStyle}" Text="{Binding CallToAction}" TextWrapping="Wrap" /> <Button Command="{x:Bind DataContext.YourCommandName, RelativeSource={RelativeSource AncestorType=GridView}, Mode=OneWay}"/> </StackPanel> </ScrollViewer> </DataTemplate>
此时绑定GameModel的属性(如Name)用{Binding Name}即可,运行时会自动从当前项的DataContext(GameModel实例)中查找对应属性。
内容的提问来源于stack exchange,提问作者rossir.paulo
相关产品推荐
相关产品推荐

