【问题标题】:ComboBox Item Selection Works With Keyboard But Not Mouse组合框项目选择适用于键盘但不适用于鼠标
【发布时间】:2013-07-09 19:03:47
【问题描述】:

我有一个组合框在运行时没有按预期工作。我可以使用鼠标展开下拉窗口,但单击一个项目似乎没有选择它。下拉菜单消失,但选择没有改变。使用键盘时,相同的控件似乎可以按预期工作。向上/向下箭头更改选择。我也可以使用箭头键选择和输入来选择更改值。

如何点击选择项目?

  <DataTemplate DataType="{x:Type myType}">
    <Border ...>
      <Grid x:Name="upperLayout">
        <Grid x:Name="lowerLayout">
          <ComboBox x:Name="combo"
            Grid.Column="2"
            ItemsSource="{Binding Things}"
            SelectedItem="{Binding SelectedThing}"
            >
            <ComboBox.ItemTemplate>
              <DataTemplate>
                <TextBlock Text="{Binding Name}" />
              </DataTemplate>
            </ComboBox.ItemTemplate>
          </ComboBox>
        </Grid>
      </Grid>
    </Border>
  </DataTemplate>

【问题讨论】:

  • 当您更改 SelectedItem 时,SelectedThing 是否会更改?
  • 您是否尝试查看 SelectionChanged 是否被调用?只需将事件添加为方法和断点即可。
  • 我认为 TextBlock 是默认设置,因此您可以只设置 DisplayMemberPath。怀疑这会解决它,但值得一试。我什至会尝试 RO 文本框。
  • SelectionChanged 未被调用,DisplayMemberPath 已实现并使 XAML 更简单。发现问题,请参阅提供的答案。

标签: c# wpf xaml combobox datatemplate


【解决方案1】:

我无法从您的代码中判断出什么问题,但是我强烈建议您使用 Snoop 来调试您的控件 (http://snoopwpf.codeplex.com/)

通过按住 Ctrl+Shift 并将鼠标指向 ComboBox 应该抓取输入的位置,您会立即发现谁拥有焦点,而不是组合框。

您甚至可以更改属性的值,这真的是您调试模板的最佳朋友!

编辑

恐怕您发布的代码对我有用:

<Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfApplication6="clr-namespace:WpfApplication6"
        Title="MainWindow"
        Width="525"
        Height="350">
    <Window.Resources>
        <DataTemplate x:Key="myTemplate" DataType="{x:Type wpfApplication6:MyType}">
            <Border>
                <Grid x:Name="upperLayout">
                    <Grid x:Name="lowerLayout">
                        <ComboBox x:Name="combo"
                                  Grid.Column="0"
                                  ItemsSource="{Binding Path=Things}"
                                  SelectedItem="{Binding Path=SelectedThing}">
                            <ComboBox.ItemTemplate>
                                <DataTemplate DataType="{x:Type wpfApplication6:MyThing}">
                                    <TextBlock Text="{Binding Name}" />
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>
                    </Grid>
                </Grid>
            </Border>
        </DataTemplate>
    </Window.Resources>
    <Grid x:Name="grid">
        <ContentControl x:Name="content" ContentTemplate="{StaticResource myTemplate}" Margin="58,79,71,40" />
    </Grid>
</Window>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        MyType type = new MyType()
            {
                Things = new List<MyThing>() {new MyThing() {Name = "aaa"}, new MyThing() {Name = "bbb"}}
            };
        content.Content = type;
    }
}

public class MyType
{
    public MyThing SelectedThing { get; set; }
    public List<MyThing> Things { get; set; }
}

public class MyThing
{
    public string Name { get; set; }
}

也许是其他东西搞砸了它,例如没有键的样式或其他任何东西,请发布更多您遇到问题的代码。

【讨论】:

    【解决方案2】:

    根本原因是另一个开发人员实施了一些代码,改变了预览鼠标按下事件的焦点。此代码已更新为在不修改焦点的情况下具有所需的行为,并且组合框现在可以按预期工作。诊断所需的信息不在原始问题中(不能全部发布...)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 2019-03-10
      相关资源
      最近更新 更多