2013-11-07 3 views
0

Мне нужно создать какой-то контроль, как этот Something like ListBox with autogenerated textbox fieldsWPF управления текстового поля автоматически созданное

Сначала я должен иметь 1 пустое поле. После того, как я написал текст в этом поле, появится новое поле. И так далее. Если я удаляю весь текст из поля - старое (правое) поле также удаляется.

В моем проекте я использую MVVM. Я думаю о ListBox с TextBox DataTemplate. Но не понимаю, как правильно использовать события или что-то еще. У кого-нибудь есть идея или может быть известно, что готовый элемент управления для WPF?

Спасибо!

+0

Если вы уже попробовали решение, разместить код этого решения и конкретный вопрос с этим. Если вы этого не сделали, попробуйте решение и вернитесь с конкретным вопросом. –

+0

Я нашел решение. Не лучший (я думаю), но он работает. Я скоро напишу – chromigo

ответ

0

Проблема была решена. Основная идея - уведомлять и обрабатывать событие PropertyChange в каждом элементе из коллекции.

наш Вид:

<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); 
    } 
} 
Смежные вопросы