Search code examples
wpftextboxlistboxcontrolsauto-generate

WPF Autogenerated textbox control


I need to create some Control,like thatSomething like ListBox with autogenerated textbox fields

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!


Solution

  • 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);
        }   
    }