Динамично добавяне на елементи към списъчната кутия на WPF

Опитвам се да създам приложение, което потребителят посочва към папка с PDF файлове. на фактури, след това програмата анализира PDF файловете, за да разбере кои от тях съдържат имейл адрес и кои не. и това е мястото, където съм заседнал:

След това искам да добавя имената на файловете към Listbox за печат или Listbox за имейл.

Накарах всички останали части да работят, като избрах папката и анализирах PDF файла и добавих пътя на папката към обект на текстово поле.

След това изпълнявам функция:

private void listFiles(string selectedPath)
        {
            string[] fileEntries = Directory.GetFiles(selectedPath);
            foreach (string files in fileEntries)
            {

                try
                {
                    ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
                    using (PdfReader reader = new PdfReader(files))
                    {
                        string thePage = PdfTextExtractor.GetTextFromPage(reader, 1, its);
                        string[] theLines = thePage.Split('\n');
                        if (theLines[1].Contains("@"))
                        {
                           // System.Windows.MessageBox.Show("denne fil kan sendes som email til " + theLines[1], "Email!");

                        }
                        else
                        {
                            System.Windows.MessageBox.Show("denne fil skal Printes da " + theLines[1] + " ikke er en email", "PRINT!");
                        }
                    }
                }
                catch (Exception exc)
                {
                    System.Windows.MessageBox.Show("FEJL!", exc.Message);
                }



            }
        }

И именно в тази функция искам да мога да добавя файловете към всеки Listbox.

Моят XAML изглежда така:

<Grid.Resources>
        <local:ListofPrint x:Key="listofprint"/>
</Grid.Resources>

<ListBox x:Name="lbxPrint" ItemsSource="{StaticResource listofprint}" HorizontalAlignment="Left" Height="140" Margin="24.231,111.757,0,0" VerticalAlignment="Top" Width="230"/>

Но получавам грешката: Името „ListofPrint“ не съществува в пространството от имена „clr-namespace:test_app“.

ListofPrint е тук:

public class ListofPrint : ObservableCollection<PDFtoPrint>
    {
        public ListofPrint(string xfile)
        {
            Add(new PDFtoPrint(xfile));
        }
    }

Опитвах се да се ориентирам в документацията на MSDN и прочетох 10 различни подобни въпроса на този сайт, но предполагам, че проблемът ми е, че не знам точно какъв е проблемът ми. първо, това е проблем със свързването на данни, но аз основно копирах извадката от документацията, за да си поиграя, но това е, което ми създава проблеми.

Надяваме се, че някой тук може да ми обясни основите на обвързването на данни и как то съответства на моята ObservableCollection.


person Jonas    schedule 27.05.2017    source източник


Отговори (1)


Трябва да създадете екземпляр на вашия клас колекция и да свържете ListBox към него. Най-простото нещо е да зададете неговите DataContext на this. Написах пример:

Прозорец:

public class MyWindow : Window
{
    // must be a property! This is your instance...
    public YourCollection MyObjects {get; } = new YourCollection();

    public MyWindow()
    {
        // set datacontext to the window's instance.
        this.DataContext = this;
        InitializeComponent();
    }

    public void Button_Click(object sender, EventArgs e)
    {
        // add an object to your collection (instead of directly to the listbox)
        MyObjects.AddTitle("Hi There");
    }
}

Вашата колекция notifyObject:

public class YourCollection : ObservableCollection<MyObject>
{
    // some wrapper functions for example:
    public void Add(string title)
    {  
       this.Add(new MyObject { Title = title });
    }
}

Клас на елемент:

// by implementing the INotifyPropertyChanged, changes to properties
// will update the listbox on-the-fly
public class MyObject : INotifyPropertyChanged
{
     private string _title;

     // a property.
     public string Title
     {
         get { return _title;}
         set
         {
             if(_title!= value)
             {
                 _title = value;
                 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs( nameof(Title)));
             }
         }
     }
     public event PropertyChangedEventHandler PropertyChanged;
}

Xaml:

<ListBox ItemsSource="{Binding MyObjects}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Title}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
person Jeroen van Langen    schedule 27.05.2017