让我参加一个简单的演示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_TextChanged
在PropertyChanged
属性上触发Text
。与UpdateSourceTrigger = PropertyChanged
结合使用可使文本框自动完成功能,换句话说就是在我键入内容时更新源代码。默认行为是失去焦点时。
单独放置文本框时,该设置可以很好地运行。但是,当我将其放在DataTemplate中时,就会出现问题。当我更改文本时,焦点会弹出到ListView中。除非我单击该文本框,否则找不到重新获得键盘对文本框焦点的方法。
我尝试了textbox.Focus()
,Keyboard.Focus(textbox)
。他们都失败了。
更新1:这是我项目中的一个简单示例。在我的项目中,我的X和Y坐标分别为2 ObservableCollection<double>
。我想在“文本框中”键入内容时更新几何数据。