I need to create some Control,like that
First i must have 1 empty field. After I wrote some text in this field the new field is appear. And so on. If i remove all text from field - old (right) field is removed too.
In my project i use MVVM. I think about ListBox with TextBox DataTemplate. But don't understand how to correctly use events or something else. Anyone have some idea or may be know ready control for WPF?
Thanks!
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);
}
}