IRONSOFTWAREHOME
AKTUALNOŚCI DLA PROGRAMISTÓW

C# ObservableCollection (Jak to działa dla deweloperów)

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Jacob Mellor
Updated: 21 kwietnia 2026

W C# ObservableCollection to potężna struktura danych, która automatycznie powiadamia słuchaczy, gdy elementy są dodawane, usuwane lub zmieniane. Jest to szczególnie przydatne w scenariuszach dynamicznego zbierania danych, na przykład gdy trzeba odzwierciedlić zmiany w czasie rzeczywistym w interfejsie użytkownika lub raportach. Po połączeniu z IronPDF ta potężna kolekcja może być używana do generowania dynamicznych PDF-ów na podstawie danych na żywo.

IronPDF to solidna biblioteka do generowania PDF-ów w C#. Dzięki możliwościom konwersji HTML do PDF, łatwo jest tworzyć wysokiej jakości PDF-y, niezależnie czy trzeba tworzyć faktury, raporty, czy inne dokumenty na podstawie danych w czasie rzeczywistym. W tym artykułe pokażemy, jak zintegrować klasę ObservableCollection z IronPDF, wykorzystując wiązanie danych do generowania PDF, który dynamicznie aktualizuje się w miarę zmian danych.

Zrozumienie ObservableCollection

Co to jest ObservableCollection?

ObservableCollection to klasa w C# implementująca interfejs INotifyCollectionChanged, który dostarcza powiadomienia, gdy elementy są dodawane, usuwane lub modyfikowane. Jest powszechnie używana do wiązania danych w aplikacjach UI, takich jak WPF, gdzie zmiany w kolekcji automatycznie wyzwalają aktualizacje w interfejsie użytkownika. W odróżnieniu od innych kolekcji, takich jak List, ObservableCollection oferuje wbudowane powiadomienia o zdarzeniach, co czyni ją idealną do scenariuszy, w których dane muszą być odzwierciedlane w czasie rzeczywistym.

ObservableCollection automatycznie obsługuje zmiany całej kolekcji, co ułatwia zarządzanie i wyświetlanie dynamicznej kolekcji danych w twojej aplikacji.

Typowe przypadki użycia

  • Wiązanie z komponentami UI: W WPF, na przykład, ObservableCollection jest często używany do wiązania danych z elementami sterującymi, takimi jak ListView, DataGrid i ComboBox. Gdy zmienia się podstawowa kolekcja, interfejs użytkownika jest automatycznie aktualizowany.
  • Aktualizacje w czasie rzeczywistym: Gdy dane zmieniają się często, ObservableCollection zapewnia, że interfejs użytkownika jest zawsze zsynchronizowany. Na przykład, można go użyć do raportu na żywo, gdzie nowe wpisy danych są dodawane do kolekcji w czasie rzeczywistym, a raport aktualizuje się odpowiednio.
  • Dynamiczne zmiany: Jeśli Twoja aplikacja pozwala użytkownikom dodawać, usuwać lub modyfikować dane, ObservableCollection może być użyta do automatycznego odzwierciedlenia tych zmian w UI lub innych komponentach.

Praca z IronPDF

Przegląd IronPDF

C# ObservableCollection (Jak to działa dla deweloperów): Rysunek 1

Jak wspomnieliśmy na początku tego artykułu, IronPDF to biblioteka .NET do generowania PDF, która ułatwia tworzenie, modyfikowanie i renderowanie dokumentów PDF. W przeciwieństwie do niektórych innych bibliotek PDF, IronPDF zapewnia bogaty zestaw funkcji upraszczających pracę z PDF-ami, takich jak konwersja HTML do PDF, dodawanie znaków wodnych, manipulowanie istniejącymi PDF-ami i więcej.

IronPDF pozwala również programistom na renderowanie PDF-ów z różnych źródeł danych, w tym HTML, obrazów i zwykłego tekstu, co jest szczególnie przydatne, gdy trzeba prezentować dynamiczne dane. Dzięki API IronPDF można generować wysokiej jakości PDF-y, w tym szczegółowe układy, tabele, obrazy i style.

Ustawienie IronPDF

Aby rozpocząć pracę z IronPDF, należy zainstalować bibliotekę za pomocą NuGet. Możesz dodać ją do swojego projektu, uruchamiając następujące polecenie w Konsoli Menedżera Pakietów:

PM > Install-Package IronPdf

Po zainstalowaniu możesz zainicjować IronPDF i używać jego potężnych funkcji. W tym artykułe skoncentrujemy się na generowaniu PDF-ów z dynamicznych danych w ObservableCollection.

Integracja ObservableCollection z IronPDF

Przypadek użycia: Dynamiczne generowanie PDF-ów z ObservableCollection

Wyobraźmy sobie scenariusz, w którym trzeba wygenerować fakturę PDF z listy pozycji przechowywanych w ObservableCollection. Gdy do kolekcji będą dodawane lub usuwane elementy, PDF powinien być regenerowany automatycznie, aby odzwierciedlać aktualny stan danych.

Do tego zadania, ObservableCollection zapewnia łatwy sposób zarządzania pozycjami w fakturze, a IronPDF pozwoli nam generować i eksportować fakturę do formatu PDF.

Wiązanie danych z zawartością PDF

Aby związać dane w ObservableCollection z PDF, musisz przejść przez kolekcję i dodać jej elementy do zawartości PDF. IronPDF zapewnia metody tworzenia tabel, dodawania tekstu i dostosowywania układu, co ułatwia przedstawienie danych w ustrukturyzowany sposób.

Na przykład, jeśli masz fakturę z kilkoma elementami, możesz dynamicznie wygenerować PDF, przechodząc przez ObservableCollection i dodając każdy element do tabeli lub listy w dokumencie. IronPDF pozwala na wysoki poziom dostosowania, w tym regulację czcionek, obramowań, a nawet uwzględnianie obrazów, takich jak loga lub kody kreskowe.

Przykład pierwszy: Generowanie PDF za pomocą ObservableCollection

Przyjrzyjmy się prostemu przykładowi, aby pokazać, jak to działa. Załóżmy, że masz kolekcję osób (reprezentowaną przez klasę Person), i chcesz wygenerować PDF, który odzwierciedla szczegóły tych osób. Za każdym razem, gdy do kolekcji dodawana jest nowa osoba, PDF będzie automatycznie aktualizowany.

Przykładologia klasy Person

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

W tym przypadku, klasa Person zawiera podstawowe właściwości, takie jak Name i Age. Będziemy używać tej klasy w połączeniu z ObservableCollection, aby dynamicznie generować PDF.

Tworzenie ObservableCollection

using System.Collections.ObjectModel;

var collection = new ObservableCollection<Person>
{
    new Person { Name = "John Doe", Age = 30 },
    new Person { Name = "Jane Smith", Age = 28 }
};

Ta ObservableCollection zawiera kolekcję obiektów typu Person, z każdym mającym Name i Age. Gdy element jest dodawany lub usuwany, uruchamiane są obsługiwane zdarzenia, które będziemy używać do dynamicznej aktualizacji PDF.

Dodawanie obsługiwaczy zdarzeń dla zmian w kolekcji

W tym przykładzie subskrybujemy zdarzenie CollectionChanged klasy ObservableCollection, aby automatycznie regenerować PDF za każdym razem, gdy kolekcja się zmienia. To jest przydatne, jeśli musisz reagować na zmiany, takie jak dodawanie lub usuwanie obiektu Person.

// Subscribe to the ObservableCollection's CollectionChanged event
collection.CollectionChanged += (object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) =>
{
    // Regenerate the PDF whenever the collection changes
    GeneratePersonPDF(collection);
};

Dodawanie nowych osób do kolekcji

Możesz dodać nową osobę do kolekcji, a cała kolekcja wyzwoli obsługiwacz zdarzeń do regeneracji PDF. Podejście to automatycznie obsługuje zmiany dotyczące całej listy osób.

// Adding a new person to the collection
collection.Add(new Person { Name = "Alice Brown", Age = 32 });

Za każdym razem, gdy dodasz nową osobę do kolekcji, PDF będzie regenerowany z uwzględnieniem nowego wpisu.

Wiązanie właściwości Age

Możesz również związać wiek osoby z jakimś zewnętrznym systemem (jak UI lub inne części aplikacji), aby automatycznie odzwierciedlało zmiany.

Oto przykład, jak właściwość Age byłaby związana w klasie Person:

public class Person
{
    public string Name { get; set; }
    private int _age;
    public int Age 
    {
        get { return _age; }
        set
        {
            _age = value;
            // Raise property changed event here if using data binding
        }
    }
}

Użycie ObservableCollection z Binding

Pokażmy, jak używać wiązania wieku do elementu UI, aktualizować jego wartość i obserwować zmiany odzwierciedlane w kolekcji:

ObservableCollection<Person> people = new ObservableCollection<Person>
{
    new Person { Name = "John", Age = 30 },
    new Person { Name = "Jane", Age = 28 }
};
// Binding the Age of the first person to a UI element (pseudo-code)
someUIElement.Text = people[0].Age.ToString();

Generowanie PDF z IronPDF

Teraz, gdy ustawiliśmy ObservableCollection i dodaliśmy obsługiwane zdarzenia, czas skupić się na generowaniu PDF, który odzwierciedla dynamiczną kolekcję osób.

using IronPdf;

public void GeneratePersonPDF(ObservableCollection<Person> people)
{
    var pdf = new ChromePdfRenderer();  // Initialize IronPDF's ChromePdfRenderer class
    // Create HTML content representing the people in the collection
    var htmlContent = "<h1>People Information</h1><table border='1' cellpadding='5' cellspacing='0'>" +
                      "<tr><th>Name</th><th>Age</th></tr>";
    foreach (var person in people)
    {
        htmlContent += $"<tr><td>{person.Name}</td><td>{person.Age}</td></tr>";
    }
    
    htmlContent += "</table>";
    // Convert the HTML content to a PDF
    var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
    // Save the generated PDF to disk
    pdfDocument.SaveAs("PeopleInformation.pdf");
}

Przykład drugi: Generowanie faktury PDF z ObservableCollection

Oto przykład, jak wygenerować PDF z ObservableCollection pozycji faktury, używając IronPDF:

Krok 1: Przykładologii klasy pozycji faktury

Ta klasa reprezentuje pozycję w fakturze, z właściwościami dla nazwy pozycji, ilości, ceny i całkowitej ceny.

public class InvoiceItem
{
    public string ItemName { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; }
    public decimal Total => Quantity * Price;
}

Krok 2: Przykładująca ObservableCollection

Ten przykład inicjalizuje ObservableCollection zawierającą kilka pozycji faktury. Możesz dynamicznie dodawać, usuwać lub modyfikować elementy w tej kolekcji.

ObservableCollection<InvoiceItem> invoiceItems = new ObservableCollection<InvoiceItem>
{
    new InvoiceItem { ItemName = "Item 1", Quantity = 2, Price = 10.00m },
    new InvoiceItem { ItemName = "Item 2", Quantity = 1, Price = 25.00m },
    new InvoiceItem { ItemName = "Item 3", Quantity = 5, Price = 5.00m }
};

Krok 3: Generowanie PDF z IronPDF

Tutaj tworzymy funkcję do generowania PDF. Funkcja ta używa danych z ObservableCollection, konwertuje je na HTML, który następnie jest renderowany jako PDF przy użyciu IronPDF.

public void GenerateInvoicePDF(ObservableCollection<InvoiceItem> items)
{
    var pdf = new ChromePdfRenderer();  // Initialize IronPDF's ChromePdfRenderer class
    // Create HTML content representing the invoice
    var htmlContent = "<h1>Invoice</h1><table border='1' cellpadding='5' cellspacing='0'>" +
                      "<tr><th>Item</th><th>Quantity</th><th>Price</th><th>Total</th></tr>";
    foreach (var item in items)
    {
        htmlContent += $"<tr><td>{item.ItemName}</td><td>{item.Quantity}</td><td>{item.Price:C}</td><td>{item.Total:C}</td></tr>";
    }
    htmlContent += "</table>";
    // Convert the HTML content to a PDF
    var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
    // Save the generated PDF to disk
    pdfDocument.SaveAs("Invoice.pdf");
}

Krok 4: Subskrybowanie zdarzenia CollectionChanged

Ponieważ ObservableCollection automatycznie powiadamia o zmianach, możesz łatwo regenerować PDF za każdym razem, gdy kolekcja jest aktualizowana. Na przykład, jeśli pozycja jest dodawana lub usuwana, PDF można regenerować z zaktualizowanymi danymi.

Oto, jak możesz subskrybować zdarzenie CollectionChanged i regenerować PDF za każdym razem, gdy kolekcja się zmienia:

// Subscribe to the ObservableCollection's CollectionChanged event
invoiceItems.CollectionChanged += (sender, e) =>
{
    // Regenerate the PDF whenever the collection changes
    GenerateInvoicePDF(invoiceItems);
};

Krok 5: Dodawanie pozycji i testowanie

Możesz teraz przetestować, dodając nowe pozycje do ObservableCollection i obserwować, jak PDF jest automatycznie regenerowany.

// Adding a new item to the ObservableCollection
invoiceItems.Add(new InvoiceItem { ItemName = "Item 4", Quantity = 3, Price = 12.50m });

Pełny przykład kodu

using System;
using System.Collections.ObjectModel;
using IronPdf;

public class InvoiceItem
{
    public string ItemName { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; }
    // Property to calculate the total price for each item
    public decimal Total => Quantity * Price;
}
public class InvoiceGenerator
{
    // Function to generate the invoice PDF
    public void GenerateInvoicePDF(ObservableCollection<InvoiceItem> items)
    {
        var pdf = new ChromePdfRenderer();  // Initialize IronPDF's ChromePdfRenderer class
        // Create HTML content representing the invoice
        var htmlContent = "<h1>Invoice</h1><table border='1' cellpadding='5' cellspacing='0'>" +
                          "<tr><th>Item</th><th>Quantity</th><th>Price</th><th>Total</th></tr>";
        foreach (var item in items)
        {
            htmlContent += $"<tr><td>{item.ItemName}</td><td>{item.Quantity}</td><td>{item.Price:C}</td><td>{item.Total:C}</td></tr>";
        }
        htmlContent += "</table>";
        // Convert the HTML content to a PDF
        var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
        // Save the generated PDF to disk
        pdfDocument.SaveAs("Invoice.pdf");
    }
    
    // Main function to test the code
    public static void Main(string[] args)
    {
        var invoiceItems = new ObservableCollection<InvoiceItem>
        {
            new InvoiceItem { ItemName = "Item 1", Quantity = 2, Price = 10.00m },
            new InvoiceItem { ItemName = "Item 2", Quantity = 1, Price = 25.00m },
            new InvoiceItem { ItemName = "Item 3", Quantity = 5, Price = 5.00m }
        };
        
        var invoiceGenerator = new InvoiceGenerator();
        
        // Subscribe to the ObservableCollection's CollectionChanged event
        invoiceItems.CollectionChanged += (sender, e) =>
        {
            // Regenerate the PDF whenever the collection changes
            invoiceGenerator.GenerateInvoicePDF(invoiceItems);
        };
        
        // Generate initial PDF
        invoiceGenerator.GenerateInvoicePDF(invoiceItems);
        
        // Add a new item to the collection and automatically regenerate the PDF
        invoiceItems.Add(new InvoiceItem { ItemName = "Item 4", Quantity = 3, Price = 12.50m });
        
        // Remove an item and see the PDF update
        invoiceItems.RemoveAt(0);
    }
}

Wynik

C# ObservableCollection (Jak to działa dla deweloperów): Rysunek 2 - Wyjściowy plik PDF

Co robi kod

  • Klasa InvoiceItem: Reprezentuje pozycję faktury z właściwościami ItemName, Quantity, Price i obliczonym Total.
  • ObservableCollection: Używana do przechowywania listy pozycji faktury. Kolekcja automatycznie powiadamia słuchaczy o jakichkolwiek zmianach (np. gdy elementy są dodawane lub usuwane).
  • GenerateInvoicePDF: Ta metoda tworzy zawartość HTML reprezentującą fakturę i używa IronPDF do konwersji jej do PDF.
  • CollectionChanged: Zdarzenie ObservableCollection obsługiwane jest w celu regeneracji PDF za każdym razem, gdy kolekcja się zmienia, co sprawia, że generowanie PDF jest dynamiczne.
  • Testowanie: Metoda Main demonstruje, jak dodawanie i usuwanie elementów z ObservableCollection wyzwala regenerację PDF.

Kwestie związane z wydajnością

Obsługa dużych kolekcji

Podczas pracy z dużymi instancjami ObservableCollection, wydajność może stać się problemem. Regeneracja PDF za każdym razem, gdy kolekcja się zmienia, może być zasobożerna, jeśli elementów jest dużo. Aby zminimalizować ten problem, rozważ porcjowanie aktualizacji lub używanie technik, takich jak paginacja, aby uniknąć przeciążenia procesu generacji PDF.

Efektywność renderowania PDF

Aby zapewnić efektywność renderowania PDF, zapamiętaj poniższe wskazówki:

  • Minimalizuj niepotrzebne ponowne renderowanie: Regeneruj PDF tylko wtedy, gdy dane zmieniają się znacząco (np. gdy elementy są dodawane lub usuwane).
  • Optymalizuj układ tabeli: Podczas renderowania dużych zestawów danych, podziel je na mniejsze, bardziej zarządzalne sekcje, aby poprawić czas renderowania.
  • Używaj cache: Cache wcześniej wygenerowane PDF-y dla danych statycznych lub rzadko zmieniających się.

Wnioski

Łącząc ObservableCollection języka C# z IronPDF, możesz łatwo generować dynamiczne PDF-y, które odzwierciedlają zmiany w czasie rzeczywistym w danych aplikacji. Niezależnie czy generujesz faktury, raporty czy inne dokumenty, to podejście pozwala automatycznie aktualizować zawartość PDF za każdym razem, gdy zmienia się podstawowa kolekcja.

Integracja ObservableCollection zapewnia, że twoja aplikacja jest zawsze na bieżąco przy minimalnym wysiłku, podczas gdy IronPDF zajmuje się ciężką pracą renderowania wysokiej jakości PDF-ów. Śledząc najlepsze praktyki i wskazówki dotyczące wydajności, omawiane w tym artykułe, możesz stworzyć bezproblemową doświadczenie generowania PDF dla swoich aplikacji .NET.

Chcesz samodzielnie wypróbować IronPDF? Pobierz bezpłatną wersję próbną już dziś, aby podnieść swoje projekty PDF w C#, i koniecznie sprawdź sekcję obszernej dokumentacji, aby zobaczyć więcej tej biblioteki w akcji.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczącą ponad 50 osób, obsługującą NASA, Teslę i światowe agencje rządowe.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta