【问题标题】:Not able to enter text in a TextBox inside a GridView/ListView (WPF)无法在 GridView/ListView (WPF) 内的 TextBox 中输入文本
【发布时间】:2010-08-20 07:43:29
【问题描述】:

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

还使用空的 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) 我没有在任何父控件中注册“任何”事件处理程序。

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

Window window1 = new Window();

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

window1.Show();

【问题讨论】:

    标签: wpf listview gridview event-bubbling


    【解决方案1】:

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

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

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

    还有一点:是线

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

    真的是行不通还是你有绑定不工作?

    更新:

    好的,因为它是一个 win-forms-application,您必须重定向来自 win32 消息循环的消息。看here、here 和here。

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

    【讨论】:

    • 这是行不通的。我最初有绑定,但为简单起见,直接写了一个文本。我无法键入文本框可以在 Text 属性中设置的任何内容。
    • 另外,你是对的。我正在从 WinForm 应用程序加载此 WPF 窗口。在我的问题中对此发表评论。
    • 我去过那里。我今天明白发生了什么。我现在可以安息了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2015-02-08
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    相关资源
    最近更新 更多