Позвольте мне взять простую демонстрацию Класс друга:
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. Я хочу обновить данные геометрии при вводе в текстовом поле.