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

Я пытаюсь создать приложение, которое пользователь указывает на папку с файлами PDF. Invoices программа затем анализирует PDF-файлы, чтобы выяснить, какие из них содержат адрес электронной почты, а какие нет. и вот где я застрял:

Затем я хочу добавить имена файлов либо в список для печати, либо в список для электронной почты.

У меня работают все остальные биты, выбирая папку и анализируя 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);
                }



            }
        }

И именно в этой функции я хочу иметь возможность добавлять файлы в любой список.

Мой 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