无法在GridView / ListView(WPF)内的TextBox中输入文本

时间:2010-08-20 07:43:29

标签: wpf listview gridview event-bubbling

我在ListView中有一个TextBox和一个DropDown,它绑定到一个viewModel。 虽然comboBox工作正常,但我无法“输入”TextBox中的任何文本。 Backspace / SpaceBar / Ctrl + C / Ctrl + V工作正常,但只要我按下任何字母数字键,它就不会显示文本框中的任何文本。

还使用空的KeyUp / KeyDown / TextChange事件处理程序进行了检查。它会为所有类型的按键引发KeyUp / KeyDown事件,但在按任何字母数字键时不会触发TextChange。

请建议是否有人曾经遇到过这个问题。或者,如果有办法调试并找到实际问题。

这是我的XAML - 代码背后没有任何内容。

<Window x:Class="Ion.MarketView.Mmi.Plugins.AlertConfigurator.View.AlertConditionItemViewDebug"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             x:Name="aletConditionItems"
             mc:Ignorable="d" >
        <Grid >
            <Grid.Resources>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                    <Setter Property="VerticalContentAlignment" Value="Stretch" />
                </Style>
            </Grid.Resources>

            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="75"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <ListView Grid.Column="0" x:Name="lstViewConditionItems"                     
                     ItemsSource="{Binding ElementName=aletConditionItems, Path=DataContext.Items}"                          
                     SelectedItem="{Binding ElementName=aletConditionItems, Path=DataContext.SelectedItem, Mode=TwoWay}">
                <ListView.View>
                    <GridView>
                    <GridViewColumn Header="Column Id" >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <ComboBox SelectedValue="{Binding Path=ColumnId}" Margin="-6,-2,-6,-2"                
                    ItemsSource="{Binding ElementName=aletConditionItems, Path=DataContext.ColumnIds}" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                        <GridViewColumn Header="Value" Width="100" >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBox Text="Only backSpace and SpaceBar works" ></TextBox>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>


                    </GridView>
                </ListView.View>
            </ListView>

            <StackPanel Orientation="Horizontal" Grid.Column="1" VerticalAlignment="Top" >
                <Button Content="+" Width="30" Command="{Binding ElementName=aletConditionItems, Path=DataContext.OnAddConditionItem}"></Button>
            </StackPanel>
        </Grid>
    </Window>

感谢您的关注。

注意: 1)我从WinForm应用程序加载此WPF窗口。

2)问题不在于textBox与viewModel的绑定。我甚至无法编辑Text属性中硬编码的简单文本(如上面的代码所示)

3)我没有在任何父控件中注册“any”事件处理程序。

解决方案: 根据@HCL建议的链接,以下代码解决了我的问题。

Window window1 = new Window();

ElementHost.EnableModelessKeyboardInterop(window1); //This is needed for Sharing Message Loops Between Win32 and WPF 

window1.Show();

1 个答案:

答案 0 :(得分:4)

如果将wpf窗口集成到win-forms-application中,我已经看到过这样的行为。如果是这样,请发表评论。

如果没有,请检查您是否在父元素(窗口,用户控件,网格)中注册了一个PreviewKeyDown事件处理程序,该处理程序将e.Handled属性设置为true(或任何其他已注册的预览事件处理程序用键盘输入)。

因为您编写了复制粘贴和空间,我假设您没有在父元素或父元素的样式或控件模板或隐式样式中设置TextBox.IsReadOnly。

还有一件事:是行

<TextBox Text="Only backSpace and SpaceBar works" ></TextBox>

真的不起作用的行还是你的绑定不起作用?

<强>更新

好的,因为它是一个win-forms-application,你必须重定向来自win32消息循环的消息。查看hereherehere

附加提示:注意在集成的WPF窗口中创建新窗口。据我记得,在老年人项目中,您还必须将消息转发到任何新的子窗口。