Frage

Ich muss so eine Kontrolle erstellen, soSomething like ListBox with autogenerated textbox fields

Zuerst muss ich 1 leeres Feld haben. Nachdem ich in diesem Feld einen Text geschrieben hatte, wird das neue Feld angezeigt. Usw. Wenn ich den gesamten Text aus dem Feld entferne - wird auch das Feld des alten (rechten) Feldes entfernt.

In meinem Projekt verwende ich MVVM. Ich denke über ListBox mit TextBox DataTemplate nach. Aber verstehen Sie nicht, wie man Ereignisse oder etwas anderes richtig verwendet. Hat jemand eine Idee oder kann die Bereitschaft für WPF kennen?

Vielen Dank!

War es hilfreich?

Lösung

Das Problem wurde gelöst. Die Hauptidee - zur Benachrichtigung und zur Verarbeitung von PropertyChange -Events in jedem Artikel aus der Sammlung.

unsere Ansicht:

<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);
    }   
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top