【问题标题】:WPF Input KeyBinding for a ListBox Item列表框项的 WPF 输入键绑定
【发布时间】:2016-09-16 16:37:17
【问题描述】:

我有一个 WPF 应用程序,我以编程方式将焦点设置到 ListBox 项,之后使用 向上/向下箭头我从一个项目导航到另一个项目。我需要为该适当的项目实现 ENTER KeyEvent,它应该触发 ViewModel 中的 ICommand SelectItemCommand

考虑 ViewModel 代码:

public class MobileViewModel
{
    public ObservableCollection<Mobile> MobileCollection { get; set; }

    public MobileViewModel()
    {
        MobileCollection = new ObservableCollection<Mobile>()
        {
            new Mobile() { ID = 1, Name = "iPhone 6S", IsSelected = false },
            new Mobile() { ID = 2, Name = "Galaxy S7", IsSelected = false }                        
        }
    }

    public ICommand SelectItemCommand
    {
        get
        {
            return new DelegatingCommand((obj) =>
            {
                // Enter Key Event Operation
            });
        }
    }

}

public class Mobile
{
    public int ID { get; set; }
    public string Name { get; set; }
    public bool IsSelected { get; set; }
}

XAML 代码是

<ListBox ItemsSource="{Binding MobileCollection}" x:Name="KeyListBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Button Command="{Binding SelectItemCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MobileViewModel}}}" CommandParameter="{Binding }">
                <Button.InputBindings>
                    <KeyBinding Key="Enter" Command="{Binding SelectItemCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MobileViewModel}}}" CommandParameter="{Binding }" />
                </Button.InputBindings>
                <Button.Content>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}" />
                        </StackPanel>
                </Button.Content>
            </Button>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我的要求是在键盘 ENTER 键击中时触发 ICommand。我尝试了按钮内的 KeyBinding,但它没有发生。请帮助我。

【问题讨论】:

    标签: c# wpf xaml listbox key-bindings


    【解决方案1】:

    ListBox 键绑定是

    <ListBox.InputBindings>
        <KeyBinding Key="Enter" Command="{Binding DataContext.SelectItemCommand, ElementName=KeyListBox}" 
            CommandParameter="{Binding SelectedItem, 
                RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}"/>
    </ListBox.InputBindings>
    

    您应该指定 Element Name 并使用 DataContext 进行绑定。那么它应该可以工作了

    完整的 XAML 源代码是

    <ListBox Name="KeyListBox" ItemsSource="{Binding MobileCollection}" HorizontalAlignment="Left" Height="Auto" VerticalAlignment="Top" Width="300" HorizontalContentAlignment="Stretch">
    
        <ListBox.InputBindings>
            <KeyBinding Key="Enter" Command="{Binding DataContext.SelectItemCommand, ElementName=lstBox}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}"/>
        </ListBox.InputBindings>
    
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Button Command="{Binding DataContext.SelectItemCommand, ElementName=lstBox}" CommandParameter="{Binding }" Foreground="Black" Padding="12 10" HorizontalContentAlignment="Left">
                        <Button.Content>
                            <StackPanel>
                                <CheckBox IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Foreground="#404040">
                                    <CheckBox.Content>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding Name, IsAsync=True}" TextWrapping="Wrap" MaxWidth="270" />
                                        </StackPanel>
                                    </CheckBox.Content>
                                </CheckBox>
                            </StackPanel>
                        </Button.Content>
                    </Button>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    

    【讨论】:

      【解决方案2】:

      您可以将 InputBinding 放在 ListBox 本身上,将所选项目作为命令参数传递。

      <ListBox ItemsSource="{Binding MobileCollection}" x:Name="KeyListBox">
          <ListBox.InputBindings>
              <KeyBinding Key="Enter" Command="{Binding SelectItemCommand}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType=ListBox}}"/>
          </ListBox.InputBindings>
      
      </ListBox>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        相关资源
        最近更新 更多