سؤال

أحتاج إلى إنشاء بعض التحكم ، من هذا القبيلSomething like ListBox with autogenerated textbox fields

أولاً ، يجب أن يكون لدي حقل فارغ واحد. بعد أن كتبت بعض النص في هذا الحقل ، يظهر الحقل الجديد. وهلم جرا. إذا قمت بإزالة كل النص من الحقل - تتم إزالة الحقل القديم (الأيمن) أيضًا.

في مشروعي ، أستخدم MVVM. أفكر في ListBox مع TextBox datatemplate. لكن لا تفهم كيفية استخدام الأحداث بشكل صحيح أو أي شيء آخر. أي شخص لديه بعض الأفكار أو قد يعرف التحكم الجاهز لـ 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