Problem was solved. The main idea - to notify and to handle PropertyChange event in each item from collection.
our View:
<ListBox Name="TrunkListBox" Height="160"
ItemsSource="{Binding YourSource}"
ItemTemplate="{DynamicResource YourDataTemplate}"/>
<DataTemplate x:Key="YourDataTemplate">
<TextBox Width="200" Text="{Binding Number,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
//VM for notification about propertyChange
public class TrunkElementViewModel : NotificationObject
{
private string _number = string.Empty;
public string Number
{
get { return _number; }
set
{
_number=value;
RaisePropertyChanged(() => Number);
}
}
}
//In my class when I initialize my data -add trunk_PropertyChanged event handler each element + add empty element
void SomeInit()
{
if( SomeCollection already have items)
{
//get element and add event handler
foreach (var item in SomeCollection)
{
var trunk = new TrunkElementViewModel { Number = substring };
trunk.PropertyChanged += trunk_PropertyChanged;
TrunkNumbers.Add(trunk);
}
//add empty element(must be everytime)
var emptyTrunk = new TrunkElementViewModel();
emptyTrunk.PropertyChanged += trunk_PropertyChanged;
TrunkNumbers.Add(emptyTrunk);
}
//Hadling changing element event - add new empty item or remove empty
void trunk_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
var trunk = sender as TrunkElementViewModel;
var positionElement = TrunkNumbers.IndexOf(trunk);
//add new item in list
if (TrunkNumbers.LastOrDefault() == trunk)
{
var nextTrunk = new TrunkElementViewModel();
nextTrunk.PropertyChanged += trunk_PropertyChanged;
TrunkNumbers.Add(nextTrunk);
}
//remove item from list
else if (trunk.Number == string.Empty && TrunkNumbers.LastOrDefault() != trunk)
{
trunk.PropertyChanged -= trunk_PropertyChanged;
TrunkNumbers.Remove(trunk);
}
}