2017-05-27 390 views
1

我試圖建立一個應用程序,用戶指向PDF文件的文件夾。 發票,程序然後解析PDF文件,找出哪些包含電子郵件地址,哪些不包含。而這正是我堅持:動態添加項目WPF列表框

然後我想將文件名添加到任何列表框用於打印或列表框的電子郵件。

我得到了所有的其他位的工作,選擇文件夾和解析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的命名空間:test_app」。

的ListofPrint是在這裏:

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

我一直試圖讓MSDN文檔的竅門,並已閱讀本網站上10個不同的類似的問題,但我想我的問題是,我不我不清楚我的問題是什麼。首先它是一個數據綁定問題,但我基本上從文檔中複製樣本來玩,但這是給我的麻煩。

希望這裏有人能向我解釋數據的基礎知識結合,以及它如何對應於我的ObservableCollection。

回答

1

您需要創建您的收藏類的一個實例。和列表框綁定到它: 最simpel件事是,設定它的DataContextthis,我寫了一個例子:

窗口:

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>