gpt4 book ai didi

c# - 将按键事件绑定(bind)到 WPF 中的 ListViewItem

转载 作者:行者123 更新时间:2023-11-30 23:08:41 25 4
gpt4 key购买 nike

我有一个 ListView,它使用包含图像和文本(文件浏览器)的 ListViewItems 填充 View 。在尊重 MVVM 设计模式的同时,当用户在所选项目上按下“Enter”键时,如何触发命令?我搜索并找到了一些解决方案,但它们似乎都不适合我。

<ListView ScrollViewer.HorizontalScrollBarVisibility="Hidden"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.ScrollUnit="Item"
Background="#fdfaf4"
Name="filesView"
ItemsSource="{Binding Items}">

<ListView.ItemTemplate>
<DataTemplate>

<!-- The image and item name -->
<Grid Width="{Binding ActualWidth, ElementName=filesView, Converter={x:Static converter:GridWidthToListViewWidthConverter.Instance}}"
Background="Transparent">

<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.07*" MinWidth="25" MaxWidth="40" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

<!-- Drive, file or folder -->
<Image Grid.Column="0"
Margin="0,0,5,0"
Name="itemType"
Source="{Binding Type,
Converter={x:Static converter:HeaderToImageConverter.Instance}}" />

<!-- The text is binded to the image size, so they'll expand/shrink together -->
<TextBlock Grid.Column="1"
VerticalAlignment="Center"
FontSize="{Binding ActualHeight,
ElementName=itemType, Converter={x:Static converter:ImageSizeToFontSizeConverter.Instance}}"
Text="{Binding Name}" />

<!-- The command to enter a drive/folder is called from here -->
<Grid.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding EnterCommand, Mode=TwoWay}" />
<KeyBinding Key="Enter" Command="{Binding EnterCommand, Mode=TwoWay}" />
</Grid.InputBindings>

</Grid>

</DataTemplate>
</ListView.ItemTemplate>

</ListView>

MouseBinding 工作得很好。我试过将 KeyBinding 放在 ListView 而不是网格中,并使用 SelectedItem 属性获取焦点项目,但仍然没有。

最佳答案

ItemTemplate 中的根 Grid 或代码中的 ListViewItem 容器实现 PreviewKeyDown 事件-在 View 后面并从那里简单地执行命令,例如:

private void ListViewItem_PreviewKeyDown(object sender, KeyEventArgs e)
{
var viewModel = DataContext as YourViewModel;
viewModel.YourCommand.Execute(null);
}

<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="PreviewKeyDown" Handler="ListViewItem_PreviewKeyDown" />
</Style>
</ListView.ItemContainerStyle>

或者实现一个连接事件处理程序并执行相同操作的行为:https://www.codeproject.com/Articles/28959/Introduction-to-Attached-Behaviors-in-WPF .

这两种方法都不会破坏 MVVM 模式,因为您是从包含 XAML 标记的完全相同的 View 调用完全相同的 View 模型命令。

MVVM 不是关于从 View 中删除代码,它是关于关注点的分离。如果您使用 KeyBinding 或事件处理程序调用该命令,则无关紧要。

关于c# - 将按键事件绑定(bind)到 WPF 中的 ListViewItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46365904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com