WPF ListView包含自动完成文本框的焦点,因为文本框是其ItemsTemplate

时间:2018-06-26 16:48:50

标签: c# wpf

让我参加一个简单的演示Friend类:

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

然后我有一组静态的DataBinding朋友。

public partial class MainWindow : Window,INotifyPropertyChanged
{
    public static Friend[] Friends { get; set; } = new Friend[]
    {
            new Friend(){Name="Adam" },
            new Friend(){Name="Betty" },
            new Friend(){Name="Cate" },
    };

    public MainWindow()
    {
        InitializeComponent();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        var textbox = sender as TextBox;
        PropertyChanged?.Invoke(textbox, new PropertyChangedEventArgs(nameof(textbox.Text)));
    }
}

之后,我将朋友的名字放在带有TextBox作为ItemsTemplate的ListView中,以编辑朋友的名字

<ListView ItemsSource="{x:Static local:MainWindow.Friends }" Width="200">
<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment"  Value="Stretch"></Setter>
    </Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
    <DataTemplate>
        <TextBox Text="{Binding Path=Name ,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBox_TextChanged"/>
    </DataTemplate>
</ListView.ItemTemplate>
</ListView>

方法TextBox_TextChangedPropertyChanged属性上触发Text。与UpdateSourceTrigger = PropertyChanged结合使用可使文本框自动完成功能,换句话说就是在我键入内容时更新源代码。默认行为是失去焦点时。

单独放置文本框时,该设置可以很好地运行。但是,当我将其放在DataTemplate中时,就会出现问题。当我更改文本时,焦点会弹出到ListView中。除非我单击该文本框,否则找不到重新获得键盘对文本框焦点的方法。

我尝试了textbox.Focus()Keyboard.Focus(textbox)。他们都失败了。

  • 为什么焦点会弹出到ListView中?
  • 有什么办法可以防止这种情况?
  • 为什么不能将键盘焦点更改回“文本框”?

更新1:这是我项目中的一个简单示例。在我的项目中,我的X和Y坐标分别为2 ObservableCollection<double>。我想在“文本框中”键入内容时更新几何数据。

0 个答案:

没有答案