Я предполагаю, что это упрощенная версия того, над чем вы работаете. Текстовое поле с односторонней привязкой к коллекции строк не имеет смысла для меня.
Основная проблема в этом случае - использование простой строки в качестве источника элемента. Я предполагаю, что мы не можем гарантировать, что строки будут уникальными, поэтому мы не можем делать какие-либо выводы из textbox.Text. Кроме того, поскольку строки являются неизменяемыми, мы не можем использовать экземпляр строки для вывода чего-либо.
Первый шаг в решении - создать класс для хранения данных, к которым мы можем обратиться. (В данном случае это выглядит немного глупо, поскольку содержит строку.)
class MyData
{
public string Value { get; set; }
}
Ваш второй кодовый блок становится:
ObservableCollection<MyData> mCollection = new ObservableCollection<MyData>();
public MainWindow()
{
InitializeComponent();
this.mCollection.Add(new MyData { Value = "Test1" });
this.mCollection.Add(new MyData { Value = "Test2" });
this.mItemsControl.ItemsSource = this.mCollection;
}
Мы будем использовать свойство Tag текстового поля для хранения ссылки на наш источник привязки. Мы будем использовать это, чтобы обойти проблемы уникальности. XAML становится:
<ItemsControl Name="mItemsControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Value}" Tag="{Binding}" KeyUp="TextBox_KeyUp"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Наконец, обработчик становится:
private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key != Key.Enter)
{
return;
}
TextBox textbox = (TextBox)sender;
if (mItemsControl.Items.IndexOf(textbox.Tag) == mItemsControl.Items.Count - 1)
{
this.mCollection.Add(new MyData() { Value = "A new textbox appears!" });
}
}