UWP中如何从ItemTemplate的DataContext获取Command
在UWP ListView的ItemTemplate中获取DataContext的Command
嘿,我来帮你搞定这个问题~在UWP的ListView ItemTemplate里,默认每个Item的DataContext都是当前的FavoriteItem对象,但我们的Command一般是定义在ListView的外层DataContext(也就是你的ViewModel)里的,所以得想办法“跳出”Item的上下文,找到外层的ViewModel。这里有两种实用的方法:
方法一:使用ElementName绑定
你已经给ListView起了x:Name="FavoritesList",刚好可以利用这个名字来绑定外层的Command:
<ListView x:Name="FavoritesList" Grid.Row="0" Grid.ColumnSpan="3" Grid.RowSpan="1" Grid.Column="0" HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch" VerticalAlignment="Top" ItemsSource="{Binding Favorites.FavoritesVideos, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" > <ListView.ItemTemplate> <DataTemplate x:DataType="local:FavoriteItem"> <StackPanel Margin="10" Orientation="Horizontal"> <!-- 绑定外层ViewModel的Command --> <Button Content="" Command="{Binding DataContext.YourTargetCommand, ElementName=FavoritesList}" CommandParameter="{Binding}" /> <!-- 其他Item内容 --> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView>
ElementName=FavoritesList指定了我们要关联的ListView控件,通过它的DataContext就能直接拿到你的ViewModelCommandParameter="{Binding}"会把当前的FavoriteItem对象传递给Command的Execute方法,方便你在ViewModel里处理具体是哪一项
方法二:使用RelativeSource绑定
如果你不想依赖控件的名字,或者担心后续控件名称会变动,用RelativeSource会更灵活:
<ListView Grid.Row="0" Grid.ColumnSpan="3" Grid.RowSpan="1" Grid.Column="0" HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch" VerticalAlignment="Top" ItemsSource="{Binding Favorites.FavoritesVideos, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" > <ListView.ItemTemplate> <DataTemplate x:DataType="local:FavoriteItem"> <StackPanel Margin="10" Orientation="Horizontal"> <Button Content="" Command="{Binding DataContext.YourTargetCommand, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" CommandParameter="{Binding}" /> <!-- 其他Item内容 --> </StackPanel> </DataTemplate> </ListView.ItemTemplate> </ListView>
这种方式会向上查找父级的ListView控件,然后获取它的DataContext,效果和第一种方法完全一致,但不需要依赖控件名称,适配性更强。
额外注意事项
- 确保你的ViewModel里的Command是实现了
ICommand接口的,推荐用Microsoft.Toolkit.Mvvm库中的RelayCommand(官方MVVM工具包,简洁好用) - 记得把代码里的
YourTargetCommand替换成你ViewModel中实际的Command属性名,别写错绑定路径哦~
内容的提问来源于stack exchange,提问作者Дмитрий Шевченко
相关产品推荐
相关产品推荐

