WPF ListView использует фокус автозаполнения текстового поля, так как текстовое поле является его ItemsTemplate - PullRequest
0 голосов
/ 26 июня 2018

Позвольте мне взять простую демонстрацию Класс друга:

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)));
    }
}

После этого я помещаю имя друга в ListView с TextBox в качестве ItemsTemplate для редактирования имени друга

<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_TextChanged запускает PropertyChanged свойство Text. Комбинация с UpdateSourceTrigger = PropertyChanged дает текстовое поле возможность автозаполнения или, другими словами, обновления источника при вводе. Поведение по умолчанию - при потере фокуса.

Настройка прекрасно работает, когда текстовое поле стоит отдельно. Но когда я помещаю его в DataTemplate, возникает проблема. Когда я меняю текст, фокус попадает в ListView. Пока я не нажму на текстовое поле, я не смогу найти способ восстановить фокус клавиатуры на текстовом поле.

Я пытался textbox.Focus(), Keyboard.Focus(textbox). Все они потерпели неудачу.

  • Почему фокус попадает в ListView?
  • Есть ли способ предотвратить это?
  • Почему я не могу изменить фокус клавиатуры обратно на текстовое поле?

Обновление 1: это простой пример из моего проекта. В моем проекте у меня есть 2 ObservableCollection<double> координат X и Y. Я хочу обновить данные геометрии при вводе в текстовом поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...