我正在尝试构建一个应用程序,用户可以将其指向 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 相对应。
您需要创建集合类的实例并将 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>