문제

그런 컨트롤을 만들어야합니다Something like ListBox with autogenerated textbox fields

먼저 1 개의 빈 필드가 있어야합니다. 이 필드에서 텍스트를 쓴 후 새 필드가 나타납니다. 등등. 필드에서 모든 텍스트를 제거하면 -Old (오른쪽) 필드도 제거됩니다.

내 프로젝트에서는 MVVM을 사용합니다. TextBox DataTemplate이있는 ListBox에 대해 생각합니다. 그러나 이벤트 나 다른 것을 올바르게 사용하는 방법을 이해하지 못합니다. 누구든지 아이디어가 있거나 WPF에 대한 준비 제어를 알고있을 수 있습니까?

감사!

도움이 되었습니까?

해결책

문제가 해결되었습니다. 주요 아이디어 - 컬렉션에서 각 항목의 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);
    }   
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top