动态添加项目到WPF列表框

问题描述 投票:0回答:1

我正在尝试构建一个应用程序,用户可以将其指向 PDF 文件的文件夹。 发票后,程序会解析 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"/>

但我收到错误:命名空间“clr-namespace:test_app”中不存在名称“ListofPrint”。

打印列表在这里:

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

我一直在尝试掌握 MSDN 上的文档,并阅读了该网站上的 10 个不同的类似问题,但我想我的问题是我不确切知道我的问题是什么。首先是数据绑定问题,但我基本上是从文档中复制了示例来使用,但这就是给我带来麻烦的原因。

希望这里有人可以向我解释数据绑定的基础知识以及它如何与我的 ObservableCollection 相对应。

c# .net wpf xaml listbox
1个回答
3
投票

您需要创建集合类的实例并将 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>
© www.soinside.com 2019 - 2024. All rights reserved.