4

我在绑定到 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();
4

1 回答 1

4

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

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

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

还有一件事:是线

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

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

更新:

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

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

于 2010-08-20T08:11:59.383 回答