[{"data":1,"prerenderedAt":6792},["ShallowReactive",2],{"navigation_docs":3,"-csharp-desktop-ui-dependency-properties-part1":2949,"-csharp-desktop-ui-dependency-properties-part1-surround":6787},[4,1640,1765,2219,2352,2559,2641,2691,2748,2782,2908,2945],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"C#","i-devicon-csharp","/csharp","01.csharp",[10,13,60,90,120,202,219,253,379,404,457,650,1346,1636],{"title":11,"path":7,"stem":12},"C# Roadmap","01.csharp/index",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":59},"Fundamentals","i-lucide-book-open","/csharp/fundamentals","01.csharp/01.fundamentals",[19,23,27,31,35,39,43,47,51,55],{"title":20,"path":21,"stem":22},"Вступ до екосистеми .NET","/csharp/fundamentals/introduction-to-ecosystem","01.csharp/01.fundamentals/01.introduction-to-ecosystem",{"title":24,"path":25,"stem":26},"Структура програми на C#","/csharp/fundamentals/program-structure","01.csharp/01.fundamentals/02.program-structure",{"title":28,"path":29,"stem":30},"Змінні та Типи Даних","/csharp/fundamentals/variables-data-types","01.csharp/01.fundamentals/03.variables-data-types",{"title":32,"path":33,"stem":34},"Масиви","/csharp/fundamentals/arrays","01.csharp/01.fundamentals/04.arrays",{"title":36,"path":37,"stem":38},"Strings & Text Handling","/csharp/fundamentals/strings-text-handling","01.csharp/01.fundamentals/05.strings-text-handling",{"title":40,"path":41,"stem":42},"Дати і Час","/csharp/fundamentals/dates-time-handling","01.csharp/01.fundamentals/06.dates-time-handling",{"title":44,"path":45,"stem":46},"Потік Керування","/csharp/fundamentals/control-flow","01.csharp/01.fundamentals/07.control-flow",{"title":48,"path":49,"stem":50},"Методи","/csharp/fundamentals/methods","01.csharp/01.fundamentals/08.methods",{"title":52,"path":53,"stem":54},"Основи Відлагодження","/csharp/fundamentals/debugging-basics","01.csharp/01.fundamentals/09.debugging-basics",{"title":56,"path":57,"stem":58},"Інтерактивна Консоль (Classic)","/csharp/fundamentals/interactive-console","01.csharp/01.fundamentals/10.interactive-console",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"OOP","i-lucide-box","/csharp/oop","01.csharp/02.oop",[66,70,74,78,82,86],{"title":67,"path":68,"stem":69},"Package Management (Управління Пакетами)","/csharp/oop/package-management","01.csharp/02.oop/01.package-management",{"title":71,"path":72,"stem":73},"Класи та Об'єкти","/csharp/oop/classes-objects","01.csharp/02.oop/02.classes-objects",{"title":75,"path":76,"stem":77},"Властивості та Поля","/csharp/oop/properties-fields","01.csharp/02.oop/03.properties-fields",{"title":79,"path":80,"stem":81},"Стовпи ООП","/csharp/oop/oop-pillars","01.csharp/02.oop/04.oop-pillars",{"title":83,"path":84,"stem":85},"Advanced Types","/csharp/oop/advanced-types","01.csharp/02.oop/05.advanced-types",{"title":87,"path":88,"stem":89},"Namespaces (Простори Імен)","/csharp/oop/namespaces","01.csharp/02.oop/06.namespaces",{"title":91,"icon":92,"path":93,"stem":94,"children":95,"page":59},"Advanced Core","i-lucide-zap","/csharp/advanced-core","01.csharp/03.advanced-core",[96,100,104,108,112,116],{"title":97,"path":98,"stem":99},"Generics (Узагальнення)","/csharp/advanced-core/generics","01.csharp/03.advanced-core/01.generics",{"title":101,"path":102,"stem":103},"Делегати, Події та Лямбда-вирази","/csharp/advanced-core/delegates-events-lambdas","01.csharp/03.advanced-core/02.delegates-events-lambdas",{"title":105,"path":106,"stem":107},"Interfaces Deep Dive (Інтерфейси: Поглиблений Розгляд)","/csharp/advanced-core/interfaces-deep-dive","01.csharp/03.advanced-core/03.interfaces-deep-dive",{"title":109,"path":110,"stem":111},"Обробка Винятків","/csharp/advanced-core/exception-handling","01.csharp/03.advanced-core/04.exception-handling",{"title":113,"path":114,"stem":115},"Pattern Matching","/csharp/advanced-core/pattern-matching","01.csharp/03.advanced-core/05.pattern-matching",{"title":117,"path":118,"stem":119},"Додаткові Можливості C#","/csharp/advanced-core/additional-features","01.csharp/03.advanced-core/06.additional-features",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":59},"Architecture Best Practices","i-lucide-building-2","/csharp/architecture-best-practices","01.csharp/04.architecture-best-practices",[126,130,149,153,157,161,165,169],{"title":127,"path":128,"stem":129},"Software Design Principles (Частина 1)","/csharp/architecture-best-practices/software-design-principles","01.csharp/04.architecture-best-practices/01.software-design-principles",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":59},"Design Patterns","i-lucide-folder","/csharp/architecture-best-practices/design-patterns","01.csharp/04.architecture-best-practices/02.design-patterns",[136],{"title":137,"icon":132,"path":138,"stem":139,"children":140,"page":59},"Creational","/csharp/architecture-best-practices/design-patterns/creational","01.csharp/04.architecture-best-practices/02.design-patterns/creational",[141,145],{"title":142,"path":143,"stem":144},"Singleton (Одинак)","/csharp/architecture-best-practices/design-patterns/creational/singleton","01.csharp/04.architecture-best-practices/02.design-patterns/creational/01.singleton",{"title":146,"path":147,"stem":148},"Builder (Будівельник)","/csharp/architecture-best-practices/design-patterns/creational/builder","01.csharp/04.architecture-best-practices/02.design-patterns/creational/02.builder",{"title":150,"path":151,"stem":152},"Building Professional CLIs","/csharp/architecture-best-practices/building-professional-clis","01.csharp/04.architecture-best-practices/03.building-professional-clis",{"title":154,"path":155,"stem":156},"Validation & Flow Control","/csharp/architecture-best-practices/validation-flow-control","01.csharp/04.architecture-best-practices/04.validation-flow-control",{"title":158,"path":159,"stem":160},"The Modern .NET Host (Microsoft.Extensions)","/csharp/architecture-best-practices/modern-dotnet-host","01.csharp/04.architecture-best-practices/05.modern-dotnet-host",{"title":162,"path":163,"stem":164},"Data Mapper: Repository та DAO патерни (Частина 1)","/csharp/architecture-best-practices/data-mapper-part1","01.csharp/04.architecture-best-practices/06.data-mapper-part1",{"title":166,"path":167,"stem":168},"Data Mapper: Repository та DAO патерни (Частина 2)","/csharp/architecture-best-practices/data-mapper-part2","01.csharp/04.architecture-best-practices/07.data-mapper-part2",{"title":170,"icon":132,"path":171,"stem":172,"children":173,"page":59},"Di Ioc","/csharp/architecture-best-practices/di-ioc","01.csharp/04.architecture-best-practices/08.di-ioc",[174,178,182,186,190,194,198],{"title":175,"path":176,"stem":177},"Проблема залежностей та Інверсія Контролю","/csharp/architecture-best-practices/di-ioc/the-dependency-problem","01.csharp/04.architecture-best-practices/08.di-ioc/01.the-dependency-problem",{"title":179,"path":180,"stem":181},"Будуємо власний Service Container","/csharp/architecture-best-practices/di-ioc/build-your-own-container","01.csharp/04.architecture-best-practices/08.di-ioc/02.build-your-own-container",{"title":183,"path":184,"stem":185},"Service Locator: Паттерн та Анти-паттерн","/csharp/architecture-best-practices/di-ioc/service-locator-pattern","01.csharp/04.architecture-best-practices/08.di-ioc/03.service-locator-pattern",{"title":187,"path":188,"stem":189},"Паттерни Dependency Injection","/csharp/architecture-best-practices/di-ioc/dependency-injection-patterns","01.csharp/04.architecture-best-practices/08.di-ioc/04.dependency-injection-patterns",{"title":191,"path":192,"stem":193},"Microsoft DI: IServiceCollection та IServiceProvider","/csharp/architecture-best-practices/di-ioc/microsoft-di-deep-dive","01.csharp/04.architecture-best-practices/08.di-ioc/05.microsoft-di-deep-dive",{"title":195,"path":196,"stem":197},"Service Lifetimes та Scopes","/csharp/architecture-best-practices/di-ioc/service-lifetimes-and-scopes","01.csharp/04.architecture-best-practices/08.di-ioc/06.service-lifetimes-and-scopes",{"title":199,"path":200,"stem":201},"DI Анти-паттерни та Найкращі Практики","/csharp/architecture-best-practices/di-ioc/di-anti-patterns-and-best-practices","01.csharp/04.architecture-best-practices/08.di-ioc/07.di-anti-patterns-and-best-practices",{"title":203,"icon":132,"path":204,"stem":205,"children":206,"page":59},"Standard Library","/csharp/standard-library","01.csharp/05.standard-library",[207,211,215],{"title":208,"path":209,"stem":210},"Collections (Колекції)","/csharp/standard-library/collections","01.csharp/05.standard-library/01.collections",{"title":212,"path":213,"stem":214},"High Performance Types (Високопродуктивні Типи)","/csharp/standard-library/high-performance-types","01.csharp/05.standard-library/02.high-performance-types",{"title":216,"path":217,"stem":218},"LINQ (Language Integrated Query)","/csharp/standard-library/linq","01.csharp/05.standard-library/03.linq",{"title":220,"icon":221,"path":222,"stem":223,"children":224,"page":59},"System Internals Concurrency","i-lucide-server","/csharp/system-internals-concurrency","01.csharp/06.system-internals-concurrency",[225,229,233,237,241,245,249],{"title":226,"path":227,"stem":228},"Memory Management","/csharp/system-internals-concurrency/memory-management","01.csharp/06.system-internals-concurrency/01.memory-management",{"title":230,"path":231,"stem":232},"Reflection API: System.Type та Метадані","/csharp/system-internals-concurrency/reflection-fundamentals","01.csharp/06.system-internals-concurrency/02.reflection-fundamentals",{"title":234,"path":235,"stem":236},"Attributes та Dynamic Language Runtime","/csharp/system-internals-concurrency/attributes-dynamic","01.csharp/06.system-internals-concurrency/03.attributes-dynamic",{"title":238,"path":239,"stem":240},"Expression Trees: Швидка Альтернатива Рефлексії","/csharp/system-internals-concurrency/expression-trees-compiled","01.csharp/06.system-internals-concurrency/04.expression-trees-compiled",{"title":242,"path":243,"stem":244},"Source Generators: Compile-Time Code Generation","/csharp/system-internals-concurrency/source-generators","01.csharp/06.system-internals-concurrency/05.source-generators",{"title":246,"path":247,"stem":248},"Multithreading Fundamentals","/csharp/system-internals-concurrency/multithreading-fundamentals","01.csharp/06.system-internals-concurrency/06.multithreading-fundamentals",{"title":250,"path":251,"stem":252},"Synchronization Primitives","/csharp/system-internals-concurrency/synchronization-primitives","01.csharp/06.system-internals-concurrency/07.synchronization-primitives",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":59},"System Programming Windows","i-lucide-cpu","/csharp/system-programming-windows","01.csharp/07.system-programming-windows",[259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375],{"title":260,"path":261,"stem":262},"Як Працює Операційна Система","/csharp/system-programming-windows/how-os-works","01.csharp/07.system-programming-windows/01.how-os-works",{"title":264,"path":265,"stem":266},"Процеси в .NET — API та Запуск","/csharp/system-programming-windows/processes-in-dotnet","01.csharp/07.system-programming-windows/02.processes-in-dotnet",{"title":268,"path":269,"stem":270},"Процеси в .NET — IPC та Міжпроцесна Комунікація","/csharp/system-programming-windows/02a.processes-ipc","01.csharp/07.system-programming-windows/02a.processes-ipc",{"title":272,"path":273,"stem":274},"Application Domains та Збірки — AppDomain і AssemblyLoadContext","/csharp/system-programming-windows/appdomains-assemblies","01.csharp/07.system-programming-windows/03.appdomains-assemblies",{"title":276,"path":277,"stem":278},"Application Domains та Збірки — Plug-in Система з Hot-Reload","/csharp/system-programming-windows/03a.appdomains-plugin-system","01.csharp/07.system-programming-windows/03a.appdomains-plugin-system",{"title":280,"path":281,"stem":282},"Потоки — Основи та API Thread","/csharp/system-programming-windows/thread-fundamentals","01.csharp/07.system-programming-windows/04.thread-fundamentals",{"title":284,"path":285,"stem":286},"Потоки — Lifecycle, Пріоритети та Безпечне Завершення","/csharp/system-programming-windows/04a.thread-lifecycle-priorities","01.csharp/07.system-programming-windows/04a.thread-lifecycle-priorities",{"title":288,"path":289,"stem":290},"Проблеми Спільного Стану — Race Condition та Data Race","/csharp/system-programming-windows/shared-state-problems","01.csharp/07.system-programming-windows/05.shared-state-problems",{"title":292,"path":293,"stem":294},"Проблеми Спільного Стану — Memory Model та volatile","/csharp/system-programming-windows/05a.shared-state-memory-model","01.csharp/07.system-programming-windows/05a.shared-state-memory-model",{"title":296,"path":297,"stem":298},"Синхронізація — Monitor, lock та еволюція примітивів","/csharp/system-programming-windows/synchronization-fundamentals","01.csharp/07.system-programming-windows/06.synchronization-fundamentals",{"title":300,"path":301,"stem":302},"Синхронізація — Наскрізний Приклад та Deadlock Detection","/csharp/system-programming-windows/06a.synchronization-walkthrough","01.csharp/07.system-programming-windows/06a.synchronization-walkthrough",{"title":304,"path":305,"stem":306},"Синхронізація — Mutex, Semaphore та Event-Based Primitives","/csharp/system-programming-windows/synchronization-advanced","01.csharp/07.system-programming-windows/07.synchronization-advanced",{"title":308,"path":309,"stem":310},"Синхронізація — Interlocked, Volatile та Lock-Free Структури","/csharp/system-programming-windows/07a.synchronization-advanced-walkthrough","01.csharp/07.system-programming-windows/07a.synchronization-advanced-walkthrough",{"title":312,"path":313,"stem":314},"Interlocked, CAS та Lock-Free Структури","/csharp/system-programming-windows/interlocked-cas-lockfree","01.csharp/07.system-programming-windows/08.interlocked-cas-lockfree",{"title":316,"path":317,"stem":318},"Volatile, Memory Model та Spinning","/csharp/system-programming-windows/08a.volatile-memory-model","01.csharp/07.system-programming-windows/08a.volatile-memory-model",{"title":320,"path":321,"stem":322},"ThreadPool — Пул Потоків для Ефективного Виконання","/csharp/system-programming-windows/thread-pool","01.csharp/07.system-programming-windows/09.thread-pool",{"title":324,"path":325,"stem":326},"ThreadPool — Просунуті Сценарії та Внутрішня Будова","/csharp/system-programming-windows/09a.thread-pool-advanced","01.csharp/07.system-programming-windows/09a.thread-pool-advanced",{"title":328,"path":329,"stem":330},"Concurrent та Immutable Collections","/csharp/system-programming-windows/concurrent-collections","01.csharp/07.system-programming-windows/10.concurrent-collections",{"title":332,"path":333,"stem":334},"TPL, Task та Композиція — Від Thread до Task","/csharp/system-programming-windows/tpl-parallel-plinq","01.csharp/07.system-programming-windows/11.tpl-parallel-plinq",{"title":336,"path":337,"stem":338},"Parallel Class та PLINQ — Data Parallelism","/csharp/system-programming-windows/11a.tpl-parallel-plinq-advanced","01.csharp/07.system-programming-windows/11a.tpl-parallel-plinq-advanced",{"title":340,"path":341,"stem":342},"Async/Await — Фундамент Асинхронного Програмування","/csharp/system-programming-windows/async-fundamentals","01.csharp/07.system-programming-windows/12.async-fundamentals",{"title":344,"path":345,"stem":346},"SynchronizationContext та ConfigureAwait — Контекст Виконання","/csharp/system-programming-windows/async-context-configureawait","01.csharp/07.system-programming-windows/13.async-context-configureawait",{"title":348,"path":349,"stem":350},"Async — Просунуті Паттерни","/csharp/system-programming-windows/async-advanced","01.csharp/07.system-programming-windows/14.async-advanced",{"title":352,"path":353,"stem":354},"System.Threading.Channels — Async Producer-Consumer","/csharp/system-programming-windows/channels","01.csharp/07.system-programming-windows/15.channels",{"title":356,"path":357,"stem":358},"Асинхронна Синхронізація","/csharp/system-programming-windows/async-synchronization","01.csharp/07.system-programming-windows/16.async-synchronization",{"title":360,"path":361,"stem":362},"Unsafe Code та Вказівники","/csharp/system-programming-windows/unsafe-code","01.csharp/07.system-programming-windows/17.unsafe-code",{"title":364,"path":365,"stem":366},"P/Invoke та Windows API — Міст між .NET та Native Code","/csharp/system-programming-windows/pinvoke-winapi","01.csharp/07.system-programming-windows/18.pinvoke-winapi",{"title":368,"path":369,"stem":370},"Реєстр Windows — Центральна База Конфігурації Системи","/csharp/system-programming-windows/windows-registry","01.csharp/07.system-programming-windows/19.windows-registry",{"title":372,"path":373,"stem":374},"Windows Hooks, Hotkeys та Services — Глибока Інтеграція з ОС","/csharp/system-programming-windows/windows-hooks-services","01.csharp/07.system-programming-windows/20.windows-hooks-services",{"title":376,"path":377,"stem":378},"Системне Програмування C# (Windows) — 07.system-programming-windows","/csharp/system-programming-windows/implementation_plan","01.csharp/07.system-programming-windows/implementation_plan",{"title":380,"icon":132,"path":381,"stem":382,"children":383,"page":59},"Io","/csharp/io","01.csharp/08.io",[384,388,392,396,400],{"title":385,"path":386,"stem":387},"8.1.1. Основи роботи з файловою системою","/csharp/io/file-system-basics","01.csharp/08.io/01.file-system-basics",{"title":389,"path":390,"stem":391},"8.1.2. Потоки (Streams) та Серіалізація Даних","/csharp/io/streams-serialization","01.csharp/08.io/02.streams-serialization",{"title":393,"path":394,"stem":395},"8.2.1. JSON Serialization з System.Text.Json","/csharp/io/json-serialization","01.csharp/08.io/03.json-serialization",{"title":397,"path":398,"stem":399},"8.2.2. XML Serialization та LINQ to XML","/csharp/io/xml-serialization","01.csharp/08.io/04.xml-serialization",{"title":401,"path":402,"stem":403},"8.2.3. Binary Serialization: MessagePack та Protocol Buffers","/csharp/io/binary-serialization","01.csharp/08.io/05.binary-serialization",{"title":405,"icon":132,"path":406,"stem":407,"children":408,"page":59},"Ado Net","/csharp/ado-net","01.csharp/09.ado-net",[409,413,417,421,425,429,433,437,441,445,449,453],{"title":410,"path":411,"stem":412},"9.1. Введення в ADO.NET","/csharp/ado-net/introduction-to-adonet","01.csharp/09.ado-net/01.introduction-to-adonet",{"title":414,"path":415,"stem":416},"9.2. Клас DbConnection — з'єднання з базою даних","/csharp/ado-net/connection","01.csharp/09.ado-net/02.connection",{"title":418,"path":419,"stem":420},"9.3. Клас DbCommand — виконання SQL-запитів","/csharp/ado-net/command-and-queries","01.csharp/09.ado-net/03.command-and-queries",{"title":422,"path":423,"stem":424},"9.4. Клас DbDataReader — ефективне читання даних","/csharp/ado-net/datareader","01.csharp/09.ado-net/04.datareader",{"title":426,"path":427,"stem":428},"9.5. Параметризовані запити та захист від SQL Injection","/csharp/ado-net/parameters-and-sql-injection","01.csharp/09.ado-net/05.parameters-and-sql-injection",{"title":430,"path":431,"stem":432},"9.6. Транзакції в ADO.NET","/csharp/ado-net/transactions","01.csharp/09.ado-net/06.transactions",{"title":434,"path":435,"stem":436},"9.7. DbProviderFactory — провайдер-незалежний код","/csharp/ado-net/provider-factory","01.csharp/09.ado-net/07.provider-factory",{"title":438,"path":439,"stem":440},"9.8. Асинхронний доступ до даних","/csharp/ado-net/async-data-access","01.csharp/09.ado-net/08.async-data-access",{"title":442,"path":443,"stem":444},"9.9. Від'єднаний режим: DataSet, DataTable, DataRow","/csharp/ado-net/disconnected-mode-dataset","01.csharp/09.ado-net/09.disconnected-mode-dataset",{"title":446,"path":447,"stem":448},"9.10. DataAdapter — міст між DataSet та базою даних","/csharp/ado-net/data-adapter","01.csharp/09.ado-net/10.data-adapter",{"title":450,"path":451,"stem":452},"9.11. Data Mapper та Repository: Архітектура доступу до даних","/csharp/ado-net/data-mapper-repository","01.csharp/09.ado-net/11.data-mapper-repository",{"title":454,"path":455,"stem":456},"9.12. Identity Map, Unit of Work та Specification Pattern","/csharp/ado-net/advanced-patterns","01.csharp/09.ado-net/12.advanced-patterns",{"title":458,"icon":255,"path":459,"stem":460,"children":461,"page":59},"Ef Core","/csharp/ef-core","01.csharp/10.ef-core",[462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,532,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646],{"title":463,"path":464,"stem":465},"Що таке ORM? Від SQL до об'єктів","/csharp/ef-core/what-is-orm","01.csharp/10.ef-core/01.what-is-orm",{"title":467,"path":468,"stem":469},"Перший проєкт — від нуля до CRUD","/csharp/ef-core/first-project","01.csharp/10.ef-core/02.first-project",{"title":471,"path":472,"stem":473},"DbContext — Серце EF Core","/csharp/ef-core/dbcontext-deep-dive","01.csharp/10.ef-core/03.dbcontext-deep-dive",{"title":475,"path":476,"stem":477},"Провайдери баз даних — Архітектура та Вибір СУБД","/csharp/ef-core/database-providers","01.csharp/10.ef-core/04.database-providers",{"title":479,"path":480,"stem":481},"Конвенції EF Core — Магія без конфігурації","/csharp/ef-core/conventions","01.csharp/10.ef-core/05.conventions",{"title":483,"path":484,"stem":485},"Fluent API та Data Annotations — Явна конфігурація моделі","/csharp/ef-core/fluent-api-vs-annotations","01.csharp/10.ef-core/06.fluent-api-vs-annotations",{"title":487,"path":488,"stem":489},"Зв'язки — One-to-One та One-to-Many","/csharp/ef-core/relationships-basics","01.csharp/10.ef-core/07.relationships-basics",{"title":491,"path":492,"stem":493},"Зв'язки Advanced — Many-to-Many та Складні Сценарії","/csharp/ef-core/relationships-advanced","01.csharp/10.ef-core/08.relationships-advanced",{"title":495,"path":496,"stem":497},"Властивості — Типи, Конвертери, Компаратори (Частина 1)","/csharp/ef-core/property-configuration-part1","01.csharp/10.ef-core/09.property-configuration-part1",{"title":499,"path":500,"stem":501},"Властивості — Value Comparers, Generators, Shadow Properties (Частина 2)","/csharp/ef-core/property-configuration-part2","01.csharp/10.ef-core/09.property-configuration-part2",{"title":503,"path":504,"stem":505},"Складні типи — Owned Types та Complex Types (Частина 1)","/csharp/ef-core/complex-types-owned-part1","01.csharp/10.ef-core/10.complex-types-owned-part1",{"title":507,"path":508,"stem":509},"Складні типи — Complex Types, Keyless Entities, Порівняння (Частина 2)","/csharp/ef-core/complex-types-owned-part2","01.csharp/10.ef-core/10.complex-types-owned-part2",{"title":511,"path":512,"stem":513},"JSON Columns — Складні дані у JSON (Частина 1)","/csharp/ef-core/json-columns-part1","01.csharp/10.ef-core/11.json-columns-part1",{"title":515,"path":516,"stem":517},"JSON Columns — Value Comparers, Індекси, Провайдери (Частина 2)","/csharp/ef-core/json-columns-part2","01.csharp/10.ef-core/11.json-columns-part2",{"title":519,"path":520,"stem":521},"Успадкування — Абстрактні класи та TPH (Частина 1)","/csharp/ef-core/inheritance-part1","01.csharp/10.ef-core/12.inheritance-part1",{"title":523,"path":524,"stem":525},"Успадкування — TPT, TPC та Порівняння Стратегій (Частина 2)","/csharp/ef-core/inheritance-part2","01.csharp/10.ef-core/12.inheritance-part2",{"title":527,"path":528,"stem":529,"children":530},"Індекси, Обмеження та Схема (Частина 1)","/csharp/ef-core/indexes-constraints-part1","01.csharp/10.ef-core/13.indexes-constraints-part1",[531],{"title":527,"path":528,"stem":529},{"title":533,"path":534,"stem":535,"children":536},"Індекси, Обмеження та Схема (Частина 2)","/csharp/ef-core/indexes-constraints-part2","01.csharp/10.ef-core/13.indexes-constraints-part2",[537],{"title":533,"path":534,"stem":535},{"title":539,"path":540,"stem":541},"Seed Data — Початкові Дані (Частина 1)","/csharp/ef-core/seeding-part1","01.csharp/10.ef-core/14.seeding-part1",{"title":543,"path":544,"stem":545},"Seed Data — SQL-скрипти, Bogus та Стратегії (Частина 2)","/csharp/ef-core/seeding-part2","01.csharp/10.ef-core/14.seeding-part2",{"title":547,"path":548,"stem":549},"Global Query Filters — Глобальні Фільтри (Частина 1)","/csharp/ef-core/global-query-filters-part1","01.csharp/10.ef-core/15.global-query-filters-part1",{"title":551,"path":552,"stem":553},"Global Query Filters — Підводні камені та Інтеграція (Частина 2)","/csharp/ef-core/global-query-filters-part2","01.csharp/10.ef-core/15.global-query-filters-part2",{"title":555,"path":556,"stem":557},"LINQ-запити в EF Core (Частина 1)","/csharp/ef-core/linq-queries-part1","01.csharp/10.ef-core/16.linq-queries-part1",{"title":559,"path":560,"stem":561},"LINQ-запити в EF Core (Частина 2)","/csharp/ef-core/linq-queries-part2","01.csharp/10.ef-core/16.linq-queries-part2",{"title":563,"path":564,"stem":565},"Завантаження Пов'язаних Даних (Частина 1)","/csharp/ef-core/loading-related-data-part1","01.csharp/10.ef-core/17.loading-related-data-part1",{"title":567,"path":568,"stem":569},"Завантаження Пов'язаних Даних (Частина 2)","/csharp/ef-core/loading-related-data-part2","01.csharp/10.ef-core/17.loading-related-data-part2",{"title":571,"path":572,"stem":573},"Raw SQL, Views та Stored Procedures (Частина 1)","/csharp/ef-core/raw-sql-part1","01.csharp/10.ef-core/18.raw-sql-part1",{"title":575,"path":576,"stem":577},"Raw SQL — Stored Procedures, DbFunction та Bulk Operations (Частина 2)","/csharp/ef-core/raw-sql-part2","01.csharp/10.ef-core/18.raw-sql-part2",{"title":579,"path":580,"stem":581},"Продвинуті Запити — Compiled Queries, Bulk та Оптимізація (Частина 1)","/csharp/ef-core/advanced-queries-part1","01.csharp/10.ef-core/19.advanced-queries-part1",{"title":583,"path":584,"stem":585},"Продвинуті Запити — Query Tags, Bulk та Interceptors (Частина 2)","/csharp/ef-core/advanced-queries-part2","01.csharp/10.ef-core/19.advanced-queries-part2",{"title":587,"path":588,"stem":589},"Change Tracker — Відстеження Змін (Частина 1)","/csharp/ef-core/change-tracking-part1","01.csharp/10.ef-core/20.change-tracking-part1",{"title":591,"path":592,"stem":593},"Change Tracker — Графи Об'єктів та Disconnected (Частина 2)","/csharp/ef-core/change-tracking-part2","01.csharp/10.ef-core/20.change-tracking-part2",{"title":595,"path":596,"stem":597},"Збереження Даних та Транзакції (Частина 1)","/csharp/ef-core/saving-data-part1","01.csharp/10.ef-core/21.saving-data-part1",{"title":599,"path":600,"stem":601},"Збереження Даних — Concurrency та Outbox (Частина 2)","/csharp/ef-core/saving-data-part2","01.csharp/10.ef-core/21.saving-data-part2",{"title":603,"path":604,"stem":605},"Конкурентність та Блокування (Частина 1)","/csharp/ef-core/concurrency-part1","01.csharp/10.ef-core/22.concurrency-part1",{"title":607,"path":608,"stem":609},"Конкурентність — Дедлоки та Queue Processing (Частина 2)","/csharp/ef-core/concurrency-part2","01.csharp/10.ef-core/22.concurrency-part2",{"title":611,"path":612,"stem":613},"Міграції в EF Core — Основи (Частина 1)","/csharp/ef-core/migrations-basics-part1","01.csharp/10.ef-core/23.migrations-basics-part1",{"title":615,"path":616,"stem":617},"Міграції в EF Core — Основи (Частина 2)","/csharp/ef-core/migrations-basics-part2","01.csharp/10.ef-core/23.migrations-basics-part2",{"title":619,"path":620,"stem":621},"Міграції — Просунуті Сценарії (Частина 1)","/csharp/ef-core/migrations-advanced-part1","01.csharp/10.ef-core/24.migrations-advanced-part1",{"title":623,"path":624,"stem":625},"Міграції — Просунуті Сценарії (Частина 2)","/csharp/ef-core/migrations-advanced-part2","01.csharp/10.ef-core/24.migrations-advanced-part2",{"title":627,"path":628,"stem":629},"Управління Схемою та Database-First (Частина 1)","/csharp/ef-core/schema-management-part1","01.csharp/10.ef-core/25.schema-management-part1",{"title":631,"path":632,"stem":633},"Управління Схемою та Database-First (Частина 2)","/csharp/ef-core/schema-management-part2","01.csharp/10.ef-core/25.schema-management-part2",{"title":635,"path":636,"stem":637},"Продуктивність EF Core — Основи (Частина 1)","/csharp/ef-core/performance-fundamentals-part1","01.csharp/10.ef-core/26.performance-fundamentals-part1",{"title":639,"path":640,"stem":641},"Interceptors в EF Core (Частина 1)","/csharp/ef-core/interceptors-part1","01.csharp/10.ef-core/29.interceptors-part1",{"title":643,"path":644,"stem":645},"Interceptors в EF Core — Connection, Transaction та Materialization (Частина 2)","/csharp/ef-core/interceptors-part2","01.csharp/10.ef-core/29.interceptors-part2",{"title":647,"path":648,"stem":649},"План вивчення Entity Framework Core — Повний курс","/csharp/ef-core/implementation_plan","01.csharp/10.ef-core/implementation_plan",{"title":651,"icon":652,"path":653,"stem":654,"children":655,"page":59},"ASP.NET","i-devicon-dotnetcore","/csharp/aspnet","01.csharp/11.aspnet",[656,730,791,869,927,941,967,1057,1111,1182,1212,1289],{"title":657,"icon":658,"path":659,"stem":660,"children":661,"page":59},"Minimal API","i-lucide-network","/csharp/aspnet/minimal-api","01.csharp/11.aspnet/01.minimal-api",[662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726],{"title":663,"path":664,"stem":665},"Вступ до ASP.NET та еволюція фреймворку","/csharp/aspnet/minimal-api/introduction","01.csharp/11.aspnet/01.minimal-api/01.introduction",{"title":667,"path":668,"stem":669},"Перший додаток на ASP.NET Core","/csharp/aspnet/minimal-api/first-application","01.csharp/11.aspnet/01.minimal-api/02.first-application",{"title":671,"path":672,"stem":673},"WebApplication, Builder та Dependency Injection","/csharp/aspnet/minimal-api/webapplication-builder","01.csharp/11.aspnet/01.minimal-api/03.webapplication-builder",{"title":675,"path":676,"stem":677},"Конвеєр запитів та Middleware","/csharp/aspnet/minimal-api/request-pipeline-middleware","01.csharp/11.aspnet/01.minimal-api/04.request-pipeline-middleware",{"title":679,"path":680,"stem":681},"Маршрутизація в ASP.NET Core: Основи","/csharp/aspnet/minimal-api/routing-basics","01.csharp/11.aspnet/01.minimal-api/05.routing-basics",{"title":683,"path":684,"stem":685},"Маршрутизація в ASP.NET Core: Розширені можливості","/csharp/aspnet/minimal-api/routing-advanced","01.csharp/11.aspnet/01.minimal-api/06.routing-advanced",{"title":687,"path":688,"stem":689},"Статичні файли в ASP.NET Core","/csharp/aspnet/minimal-api/static-files","01.csharp/11.aspnet/01.minimal-api/07.static-files",{"title":691,"path":692,"stem":693},"Статичні Активи: MapStaticAssets (ASP.NET Core 9.0)","/csharp/aspnet/minimal-api/static-assets","01.csharp/11.aspnet/01.minimal-api/08.static-assets",{"title":695,"path":696,"stem":697},"Конфігурація в ASP.NET Core: Основи","/csharp/aspnet/minimal-api/configuration-fundamentals","01.csharp/11.aspnet/01.minimal-api/09.configuration-fundamentals",{"title":699,"path":700,"stem":701},"Конфігурація: Паттерн Options","/csharp/aspnet/minimal-api/configuration-options","01.csharp/11.aspnet/01.minimal-api/10.configuration-options",{"title":703,"path":704,"stem":705},"Логування в ASP.NET Core: Основи","/csharp/aspnet/minimal-api/logging-basics","01.csharp/11.aspnet/01.minimal-api/11.logging-basics",{"title":707,"path":708,"stem":709},"Логування: Serilog та Middleware","/csharp/aspnet/minimal-api/logging-advanced","01.csharp/11.aspnet/01.minimal-api/12.logging-advanced",{"title":711,"path":712,"stem":713},"Управління станом: HttpContext.Items та Cookies","/csharp/aspnet/minimal-api/state-management","01.csharp/11.aspnet/01.minimal-api/13.state-management",{"title":715,"path":716,"stem":717},"Стан сесії: Sessions","/csharp/aspnet/minimal-api/session-state","01.csharp/11.aspnet/01.minimal-api/14.session-state",{"title":719,"path":720,"stem":721},"Структура проєкту: від хаосу до архітектури","/csharp/aspnet/minimal-api/project-structure","01.csharp/11.aspnet/01.minimal-api/15.project-structure",{"title":723,"path":724,"stem":725},"Scalar у Minimal API: повний проєкт і Fluent OpenAPI","/csharp/aspnet/minimal-api/scalar-openapi-fluent","01.csharp/11.aspnet/01.minimal-api/16.scalar-openapi-fluent",{"title":727,"path":728,"stem":729},"Swagger / Swashbuckle у Minimal API: окремий класичний шлях","/csharp/aspnet/minimal-api/swagger-swashbuckle","01.csharp/11.aspnet/01.minimal-api/17.swagger-swashbuckle",{"title":731,"icon":658,"path":732,"stem":733,"children":734,"page":59},"API","/csharp/aspnet/api","01.csharp/11.aspnet/02.api",[735,739,743,747,751,755,759,763,767,771,775,779,783,787],{"title":736,"path":737,"stem":738},"Що таке API. Клієнт-серверна архітектура","/csharp/aspnet/api/what-is-api","01.csharp/11.aspnet/02.api/01.what-is-api",{"title":740,"path":741,"stem":742},"Формати даних: JSON, XML, TOML та бінарні формати","/csharp/aspnet/api/data-formats","01.csharp/11.aspnet/02.api/02.data-formats",{"title":744,"path":745,"stem":746},"Парадигми API та концепція REST","/csharp/aspnet/api/api-paradigms-rest","01.csharp/11.aspnet/02.api/03.api-paradigms-rest",{"title":748,"path":749,"stem":750},"HTTP-методи, статус-коди та заголовки","/csharp/aspnet/api/http-methods-status-codes","01.csharp/11.aspnet/02.api/04.http-methods-status-codes",{"title":752,"path":753,"stem":754},"Організація HTTP API за принципами REST","/csharp/aspnet/api/rest-organizing","01.csharp/11.aspnet/02.api/05.rest-organizing",{"title":756,"path":757,"stem":758},"Номенклатура URL та CRUD-операції","/csharp/aspnet/api/url-nomenclature-crud","01.csharp/11.aspnet/02.api/06.url-nomenclature-crud",{"title":760,"path":761,"stem":762},"Правила дизайну: іменування та стандарти","/csharp/aspnet/api/api-design-naming","01.csharp/11.aspnet/02.api/07.api-design-naming",{"title":764,"path":765,"stem":766},"Валідація, ліміти та обробка помилок","/csharp/aspnet/api/api-design-validation","01.csharp/11.aspnet/02.api/08.api-design-validation",{"title":768,"path":769,"stem":770},"Обробка помилок у Minimal API","/csharp/aspnet/api/error-handling-http","01.csharp/11.aspnet/02.api/09.error-handling-http",{"title":772,"path":773,"stem":774},"Ідемпотентність та синхронізація стану","/csharp/aspnet/api/idempotency-sync","01.csharp/11.aspnet/02.api/10.idempotency-sync",{"title":776,"path":777,"stem":778},"Пагінація та організація списків","/csharp/aspnet/api/pagination-lists","01.csharp/11.aspnet/02.api/11.pagination-lists",{"title":780,"path":781,"stem":782},"Безпека API, кешування та інтернаціоналізація","/csharp/aspnet/api/security-auth","01.csharp/11.aspnet/02.api/12.security-auth",{"title":784,"path":785,"stem":786},"Процес проєктування API та документування","/csharp/aspnet/api/api-design-process","01.csharp/11.aspnet/02.api/13.api-design-process",{"title":788,"path":789,"stem":790},"OpenAPI: контракт, специфікація та документація API","/csharp/aspnet/api/openapi","01.csharp/11.aspnet/02.api/14.openapi",{"title":792,"icon":793,"path":794,"stem":795,"children":796,"page":59},"Auth","i-lucide-shield-check","/csharp/aspnet/auth","01.csharp/11.aspnet/03.auth",[797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865],{"title":798,"path":799,"stem":800},"Основи аутентифікації та авторизації","/csharp/aspnet/auth/auth-fundamentals","01.csharp/11.aspnet/03.auth/01.auth-fundamentals",{"title":802,"path":803,"stem":804},"JWT-аутентифікація","/csharp/aspnet/auth/jwt-authentication","01.csharp/11.aspnet/03.auth/02.jwt-authentication",{"title":806,"path":807,"stem":808},"Авторизація: ролі, політики та resource-based доступ","/csharp/aspnet/auth/authorization-policies","01.csharp/11.aspnet/03.auth/03.authorization-policies",{"title":810,"path":811,"stem":812},"Cookie-аутентифікація та ASP.NET Core Identity","/csharp/aspnet/auth/cookie-auth-identity","01.csharp/11.aspnet/03.auth/04.cookie-auth-identity",{"title":814,"path":815,"stem":816},"JWT + Refresh Tokens (HttpOnly Cookie)","/csharp/aspnet/auth/04b.identity-auth-jwt","01.csharp/11.aspnet/03.auth/04b.identity-auth-jwt",{"title":818,"path":819,"stem":820},"Identity: Підтвердження Email та Скидання Пароля","/csharp/aspnet/auth/identity-email-confirmation","01.csharp/11.aspnet/03.auth/05.identity-email-confirmation",{"title":822,"path":823,"stem":824},"Identity: Двофакторна Аутентифікація (2FA)","/csharp/aspnet/auth/identity-two-factor","01.csharp/11.aspnet/03.auth/06.identity-two-factor",{"title":826,"path":827,"stem":828},"Identity: Внутрішня Архітектура та Кастомізація","/csharp/aspnet/auth/identity-internals","01.csharp/11.aspnet/03.auth/07.identity-internals",{"title":830,"path":831,"stem":832},"OAuth 2.0 та зовнішні провайдери","/csharp/aspnet/auth/oauth-external-providers","01.csharp/11.aspnet/03.auth/08.oauth-external-providers",{"title":834,"path":835,"stem":836},"Безпека на практиці: CORS, HTTPS та захист від атак","/csharp/aspnet/auth/security-hardening","01.csharp/11.aspnet/03.auth/09.security-hardening",{"title":838,"path":839,"stem":840},"Теорія OAuth 2.0: Поняття, Аналогії та Флоу","/csharp/aspnet/auth/oauth-theory","01.csharp/11.aspnet/03.auth/10.oauth-theory",{"title":842,"path":843,"stem":844},"OIDC, OAuth 2.0 та Keycloak в ASP.NET Core","/csharp/aspnet/auth/oidc-keycloak","01.csharp/11.aspnet/03.auth/10.oidc-keycloak",{"title":846,"path":847,"stem":848},"API Keys аутентифікація в ASP.NET Core","/csharp/aspnet/auth/api-keys","01.csharp/11.aspnet/03.auth/11.api-keys",{"title":850,"path":851,"stem":852},"Rate Limiting та Throttling в ASP.NET Core","/csharp/aspnet/auth/rate-limiting","01.csharp/11.aspnet/03.auth/12.rate-limiting",{"title":854,"path":855,"stem":856},"Refresh Token Rotation в ASP.NET Core","/csharp/aspnet/auth/refresh-token-rotation","01.csharp/11.aspnet/03.auth/13.refresh-token-rotation",{"title":858,"path":859,"stem":860},"Certificate Authentication та mTLS в ASP.NET Core","/csharp/aspnet/auth/certificate-auth","01.csharp/11.aspnet/03.auth/14.certificate-auth",{"title":862,"path":863,"stem":864},"RBAC, ABAC та ReBAC в ASP.NET Core","/csharp/aspnet/auth/rbac-abac-rebac","01.csharp/11.aspnet/03.auth/15.rbac-abac-rebac",{"title":866,"path":867,"stem":868},"Multi-tenancy та ізоляція даних в ASP.NET Core","/csharp/aspnet/auth/multi-tenancy","01.csharp/11.aspnet/03.auth/16.multi-tenancy",{"title":870,"icon":871,"path":872,"stem":873,"children":874,"page":59},"Нотифікації","i-lucide-bell","/csharp/aspnet/notifications","01.csharp/11.aspnet/04.notifications",[875,879,883,887,891,895,899,903,907,911,915,919,923],{"title":876,"path":877,"stem":878},"In-App нотифікації через базу даних","/csharp/aspnet/notifications/in-app-database-notifications","01.csharp/11.aspnet/04.notifications/01.in-app-database-notifications",{"title":880,"path":881,"stem":882},"Polling: Регулярний запит оновлень","/csharp/aspnet/notifications/polling","01.csharp/11.aspnet/04.notifications/02.polling",{"title":884,"path":885,"stem":886},"Server-Sent Events: Однострімовий push від сервера","/csharp/aspnet/notifications/server-sent-events","01.csharp/11.aspnet/04.notifications/03.server-sent-events",{"title":888,"path":889,"stem":890},"WebSockets: Двостороннє з'єднання в реальному часі","/csharp/aspnet/notifications/websockets","01.csharp/11.aspnet/04.notifications/04.websockets",{"title":892,"path":893,"stem":894},"SignalR: Абстракція над транспортами реального часу","/csharp/aspnet/notifications/signalr","01.csharp/11.aspnet/04.notifications/05.signalr",{"title":896,"path":897,"stem":898},"Background Services: Фонові задачі в ASP.NET Core","/csharp/aspnet/notifications/background-services","01.csharp/11.aspnet/04.notifications/06.background-services",{"title":900,"path":901,"stem":902},"Web Push нотифікації","/csharp/aspnet/notifications/web-push","01.csharp/11.aspnet/04.notifications/07.web-push",{"title":904,"path":905,"stem":906},"Email нотифікації","/csharp/aspnet/notifications/email-notifications","01.csharp/11.aspnet/04.notifications/08.email-notifications",{"title":908,"path":909,"stem":910},"Порівняння підходів: Як вибрати правильну технологію нотифікацій","/csharp/aspnet/notifications/choosing-the-right-approach","01.csharp/11.aspnet/04.notifications/09.choosing-the-right-approach",{"title":912,"path":913,"stem":914},"Hangfire: Надійне планування фонових задач","/csharp/aspnet/notifications/hangfire","01.csharp/11.aspnet/04.notifications/10.hangfire",{"title":916,"path":917,"stem":918},"Практика: Конвертація зображень у WebP через Hangfire","/csharp/aspnet/notifications/hangfire-image-webp","01.csharp/11.aspnet/04.notifications/11.hangfire-image-webp",{"title":920,"path":921,"stem":922},"Практика: Підготовка відео до HLS-стрімінгу через Hangfire","/csharp/aspnet/notifications/hangfire-video-hls","01.csharp/11.aspnet/04.notifications/12.hangfire-video-hls",{"title":924,"path":925,"stem":926},"Telegram-нотифікації: від одного повідомлення до масових розсилок і мульти-канального підходу","/csharp/aspnet/notifications/telegram-notifications","01.csharp/11.aspnet/04.notifications/13.telegram-notifications",{"title":928,"icon":929,"path":930,"stem":931,"children":932,"page":59},"Інтернаціоналізація","i-lucide-languages","/csharp/aspnet/i18n","01.csharp/11.aspnet/05.i18n",[933,937],{"title":934,"path":935,"stem":936},"Інтернаціоналізація (i18n) у Minimal API: від A до Я","/csharp/aspnet/i18n/internationalization","01.csharp/11.aspnet/05.i18n/01.internationalization",{"title":938,"path":939,"stem":940},"Humanizer: людиномовні рядки у .NET","/csharp/aspnet/i18n/humanizer","01.csharp/11.aspnet/05.i18n/02.humanizer",{"title":942,"icon":943,"path":944,"stem":945,"children":946,"page":59},"Кешування","i-lucide-layers","/csharp/aspnet/caching","01.csharp/11.aspnet/06.caching",[947,951,955,959,963],{"title":948,"path":949,"stem":950},"Огляд кешування: чотири рівні і коли що обирати","/csharp/aspnet/caching/caching","01.csharp/11.aspnet/06.caching/01.caching",{"title":952,"path":953,"stem":954},"IMemoryCache: кеш в оперативній пам'яті","/csharp/aspnet/caching/memory-cache","01.csharp/11.aspnet/06.caching/02.memory-cache",{"title":956,"path":957,"stem":958},"IDistributedCache і Redis: розподілений кеш","/csharp/aspnet/caching/distributed-cache","01.csharp/11.aspnet/06.caching/03.distributed-cache",{"title":960,"path":961,"stem":962},"Response Cache: HTTP-кешування через Cache-Control","/csharp/aspnet/caching/response-cache","01.csharp/11.aspnet/06.caching/04.response-cache",{"title":964,"path":965,"stem":966},"Output Cache: серверний кеш HTTP-відповідей (.NET 7+)","/csharp/aspnet/caching/output-cache","01.csharp/11.aspnet/06.caching/05.output-cache",{"title":968,"icon":969,"path":970,"stem":971,"children":972,"page":59},"Тестування","i-lucide-test-tube","/csharp/aspnet/testing","01.csharp/11.aspnet/07.testing",[973,977,981,985,989,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053],{"title":974,"path":975,"stem":976},"Що таке тестування? Від інтуїції до науки","/csharp/aspnet/testing/what-is-testing","01.csharp/11.aspnet/07.testing/01.what-is-testing",{"title":978,"path":979,"stem":980},"Піраміда тестування — Стратегія, а не Догма","/csharp/aspnet/testing/testing-pyramid","01.csharp/11.aspnet/07.testing/02.testing-pyramid",{"title":982,"path":983,"stem":984},"Дві Школи Тестування — Лондон проти Детройту","/csharp/aspnet/testing/testing-schools","01.csharp/11.aspnet/07.testing/03.testing-schools",{"title":986,"path":987,"stem":988},"TDD та BDD — Тести як Дизайн-інструмент","/csharp/aspnet/testing/tdd-and-bdd","01.csharp/11.aspnet/07.testing/04.tdd-and-bdd",{"title":990,"path":991,"stem":992},"Що саме тестувати — Техніки аналізу та Циклomatична складність","/csharp/aspnet/testing/what-to-test","01.csharp/11.aspnet/07.testing/05.what-to-test",{"title":994,"path":995,"stem":996},"Тестові Фреймворки — Навіщо вони і що всередині","/csharp/aspnet/testing/test-frameworks","01.csharp/11.aspnet/07.testing/06.test-frameworks",{"title":998,"path":999,"stem":1000},"xUnit — Факти, Теорії та Lifecycle тестів","/csharp/aspnet/testing/xunit-basics","01.csharp/11.aspnet/07.testing/07.xunit-basics",{"title":1002,"path":1003,"stem":1004},"xUnit Advanced — Fixtures, Кастомізація та Розширення","/csharp/aspnet/testing/xunit-advanced","01.csharp/11.aspnet/07.testing/08.xunit-advanced",{"title":1006,"path":1007,"stem":1008},"Moq — Глибоке занурення в мокування","/csharp/aspnet/testing/mocking-with-moq","01.csharp/11.aspnet/07.testing/09.mocking-with-moq",{"title":1010,"path":1011,"stem":1012},"Тестування Баз Даних — EF Core, SQLite та Testcontainers","/csharp/aspnet/testing/database-testing","01.csharp/11.aspnet/07.testing/10.database-testing",{"title":1014,"path":1015,"stem":1016},"Integration Testing — Частина 1 [Теорія та WebApplicationFactory]","/csharp/aspnet/testing/integration-testing","01.csharp/11.aspnet/07.testing/11.integration-testing",{"title":1018,"path":1019,"stem":1020},"Інтеграційне тестування — Практика","/csharp/aspnet/testing/11a.integration-testing-practice","01.csharp/11.aspnet/07.testing/11a.integration-testing-practice",{"title":1022,"path":1023,"stem":1024},"Integration Testing — Частина 2 [Просунуті Сценарії та Testcontainers]","/csharp/aspnet/testing/integration-testing-advanced","01.csharp/11.aspnet/07.testing/12.integration-testing-advanced",{"title":1026,"path":1027,"stem":1028},"Професійний Postman: Колекції, Змінні та GitHub Інтеграція","/csharp/aspnet/testing/postman-professional","01.csharp/11.aspnet/07.testing/13.postman-professional",{"title":1030,"path":1031,"stem":1032},"HttpClient у Тестах Частина 1: Архітектура та MockHttpMessageHandler","/csharp/aspnet/testing/httpclient-testing","01.csharp/11.aspnet/07.testing/14.httpclient-testing",{"title":1034,"path":1035,"stem":1036},"HttpClient у Тестах Частина 2: WireMock.Net та Resilience","/csharp/aspnet/testing/wiremock-net","01.csharp/11.aspnet/07.testing/15.wiremock-net",{"title":1038,"path":1039,"stem":1040},"Патерни та Анти-патерни Тестування: Test Smells","/csharp/aspnet/testing/testing-patterns","01.csharp/11.aspnet/07.testing/16.testing-patterns",{"title":1042,"path":1043,"stem":1044},"Просунуті інструменти: Time, Snapshots та Властивості","/csharp/aspnet/testing/advanced-testing-tools","01.csharp/11.aspnet/07.testing/17.advanced-testing-tools",{"title":1046,"path":1047,"stem":1048},"Тестування Архітектури з NetArchTest","/csharp/aspnet/testing/architecture-testing","01.csharp/11.aspnet/07.testing/18.architecture-testing",{"title":1050,"path":1051,"stem":1052},"Тестування Продуктивності: BenchmarkDotNet, NBomber та k6","/csharp/aspnet/testing/performance-testing","01.csharp/11.aspnet/07.testing/19.performance-testing",{"title":1054,"path":1055,"stem":1056},"Залишок плану для курсу \"Тестування ASP.NET Minimal API\"","/csharp/aspnet/testing/remaining_plan","01.csharp/11.aspnet/07.testing/remaining_plan",{"title":1058,"icon":1059,"path":1060,"stem":1061,"children":1062,"page":59},"Платежі","i-lucide-credit-card","/csharp/aspnet/payments","01.csharp/11.aspnet/08.payments",[1063,1067,1071,1075,1079,1083,1087,1091,1095,1099,1103,1107],{"title":1064,"path":1065,"stem":1066},"Основи платіжної інфраструктури","/csharp/aspnet/payments/payment-fundamentals","01.csharp/11.aspnet/08.payments/01.payment-fundamentals",{"title":1068,"path":1069,"stem":1070},"Методи оплати в Україні","/csharp/aspnet/payments/payment-methods-ukraine","01.csharp/11.aspnet/08.payments/02.payment-methods-ukraine",{"title":1072,"path":1073,"stem":1074},"PCI DSS та безпека платежів","/csharp/aspnet/payments/pci-dss-security","01.csharp/11.aspnet/08.payments/03.pci-dss-security",{"title":1076,"path":1077,"stem":1078},"Архітектура платіжної підсистеми","/csharp/aspnet/payments/payment-architecture","01.csharp/11.aspnet/08.payments/04.payment-architecture",{"title":1080,"path":1081,"stem":1082},"Інтеграція LiqPay (ПриватБанк)","/csharp/aspnet/payments/liqpay-integration","01.csharp/11.aspnet/08.payments/05.liqpay-integration",{"title":1084,"path":1085,"stem":1086},"Інтеграція Monobank Acquiring API","/csharp/aspnet/payments/monobank-acquiring","01.csharp/11.aspnet/08.payments/06.monobank-acquiring",{"title":1088,"path":1089,"stem":1090},"Інтеграція Stripe","/csharp/aspnet/payments/stripe-integration","01.csharp/11.aspnet/08.payments/07.stripe-integration",{"title":1092,"path":1093,"stem":1094},"Webhooks — глибоке занурення","/csharp/aspnet/payments/webhooks-deep-dive","01.csharp/11.aspnet/08.payments/08.webhooks-deep-dive",{"title":1096,"path":1097,"stem":1098},"Підписки та рекурентні платежі","/csharp/aspnet/payments/subscriptions-recurring","01.csharp/11.aspnet/08.payments/09.subscriptions-recurring",{"title":1100,"path":1101,"stem":1102},"Повернення коштів та диспути","/csharp/aspnet/payments/refunds-disputes","01.csharp/11.aspnet/08.payments/10.refunds-disputes",{"title":1104,"path":1105,"stem":1106},"Тестування платіжних інтеграцій","/csharp/aspnet/payments/testing-payments","01.csharp/11.aspnet/08.payments/11.testing-payments",{"title":1108,"path":1109,"stem":1110},"Чекліст виходу в Production","/csharp/aspnet/payments/production-checklist","01.csharp/11.aspnet/08.payments/12.production-checklist",{"title":1112,"icon":1113,"items":1114,"path":1127,"stem":1128,"children":1129,"page":59},"Популярні бібліотеки","lucide:box",[1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126],"01.fluent-validation","02.mapster","03.erroror-result-pattern","04.serilog","05.mediatr","06.polly","07.health-checks","08.feature-management","09.fluent-email","10.quest-pdf","11.bogus","12.humanizer-guard","/csharp/aspnet/libraries","01.csharp/11.aspnet/09.libraries",[1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178],{"title":1131,"path":1132,"stem":1133},"Валідація з FluentValidation в ASP.NET Core","/csharp/aspnet/libraries/fluent-validation","01.csharp/11.aspnet/09.libraries/01.fluent-validation",{"title":1135,"path":1136,"stem":1137},"Маппінг об","/csharp/aspnet/libraries/mapster","01.csharp/11.aspnet/09.libraries/02.mapster",{"title":1139,"path":1140,"stem":1141},"Обробка помилок з ErrorOr та Result Pattern в ASP.NET Core","/csharp/aspnet/libraries/erroror-result-pattern","01.csharp/11.aspnet/09.libraries/03.erroror-result-pattern",{"title":1143,"path":1144,"stem":1145},"Структуроване логування з Serilog в ASP.NET Core","/csharp/aspnet/libraries/serilog","01.csharp/11.aspnet/09.libraries/04.serilog",{"title":1147,"path":1148,"stem":1149},"CQRS та Mediator з MediatR в ASP.NET Core","/csharp/aspnet/libraries/mediatr","01.csharp/11.aspnet/09.libraries/05.mediatr",{"title":1151,"path":1152,"stem":1153},"Відмовостійкість з Polly в ASP.NET Core","/csharp/aspnet/libraries/polly","01.csharp/11.aspnet/09.libraries/06.polly",{"title":1155,"path":1156,"stem":1157},"Health Checks в ASP.NET Core","/csharp/aspnet/libraries/health-checks","01.csharp/11.aspnet/09.libraries/07.health-checks",{"title":1159,"path":1160,"stem":1161},"Feature Management та Feature Flags в ASP.NET Core","/csharp/aspnet/libraries/feature-management","01.csharp/11.aspnet/09.libraries/08.feature-management",{"title":1163,"path":1164,"stem":1165},"Відправка Email з FluentEmail в ASP.NET Core","/csharp/aspnet/libraries/fluent-email","01.csharp/11.aspnet/09.libraries/09.fluent-email",{"title":1167,"path":1168,"stem":1169},"Генерація PDF з QuestPDF в ASP.NET Core","/csharp/aspnet/libraries/quest-pdf","01.csharp/11.aspnet/09.libraries/10.quest-pdf",{"title":1171,"path":1172,"stem":1173},"Генерація тестових даних з Bogus в ASP.NET Core","/csharp/aspnet/libraries/bogus","01.csharp/11.aspnet/09.libraries/11.bogus",{"title":1175,"path":1176,"stem":1177},"Humanizer та Guard Clauses в ASP.NET Core","/csharp/aspnet/libraries/humanizer-guard","01.csharp/11.aspnet/09.libraries/12.humanizer-guard",{"title":1179,"path":1180,"stem":1181},"План модуля 10.libraries — Популярні бібліотеки ASP.NET","/csharp/aspnet/libraries/plan","01.csharp/11.aspnet/09.libraries/plan",{"title":1183,"icon":1184,"path":1185,"stem":1186,"children":1187,"page":59},"Razor Pages","i-lucide-layout-template","/csharp/aspnet/razor-pages","01.csharp/11.aspnet/10.razor-pages",[1188,1192,1196,1200,1204,1208],{"title":1189,"path":1190,"stem":1191},"Від Minimal API до Razor Pages: концептуальний перехід","/csharp/aspnet/razor-pages/from-minimal-api","01.csharp/11.aspnet/10.razor-pages/01.from-minimal-api",{"title":1193,"path":1194,"stem":1195},"PageModel: логіка сторінки Razor Pages","/csharp/aspnet/razor-pages/page-model","01.csharp/11.aspnet/10.razor-pages/02.page-model",{"title":1197,"path":1198,"stem":1199},"Razor синтаксис: шаблонізатор у .cshtml","/csharp/aspnet/razor-pages/razor-syntax","01.csharp/11.aspnet/10.razor-pages/03.razor-syntax",{"title":1201,"path":1202,"stem":1203},"Tag Helpers: типізований HTML","/csharp/aspnet/razor-pages/tag-helpers","01.csharp/11.aspnet/10.razor-pages/04.tag-helpers",{"title":1205,"path":1206,"stem":1207},"Форми і валідація: повний цикл обробки даних","/csharp/aspnet/razor-pages/forms-validation","01.csharp/11.aspnet/10.razor-pages/05.forms-validation",{"title":1209,"path":1210,"stem":1211},"Практичний проєкт: TaskManager на Razor Pages","/csharp/aspnet/razor-pages/project-task-manager","01.csharp/11.aspnet/10.razor-pages/06.project-task-manager",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":59},"ASP.NET Core MVC","/csharp/aspnet/mvc","01.csharp/11.aspnet/11.mvc",[1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1269,1273,1277,1281,1285],{"title":1218,"path":1219,"stem":1220},"Патерн MVC: архітектура, що змінила веб","/csharp/aspnet/mvc/mvc-pattern","01.csharp/11.aspnet/11.mvc/01.mvc-pattern",{"title":1222,"path":1223,"stem":1224},"Від Razor Pages до MVC: концептуальний перехід","/csharp/aspnet/mvc/from-razor-pages","01.csharp/11.aspnet/11.mvc/02.from-razor-pages",{"title":1226,"path":1227,"stem":1228},"Controllers та Actions: серце MVC","/csharp/aspnet/mvc/controllers-actions","01.csharp/11.aspnet/11.mvc/03.controllers-actions",{"title":1230,"path":1231,"stem":1232},"Маршрутизація в MVC: Convention vs Attribute Routing","/csharp/aspnet/mvc/routing-mvc","01.csharp/11.aspnet/11.mvc/04.routing-mvc",{"title":1234,"path":1235,"stem":1236},"Model Binding: від HTTP до C#","/csharp/aspnet/mvc/model-binding","01.csharp/11.aspnet/11.mvc/05.model-binding",{"title":1238,"path":1239,"stem":1240},"Views, ViewData, ViewBag, TempData і ViewModel","/csharp/aspnet/mvc/views-viewdata-tempdata","01.csharp/11.aspnet/11.mvc/06.views-viewdata-tempdata",{"title":1242,"path":1243,"stem":1244},"Filters: аспектно-орієнтоване програмування в MVC","/csharp/aspnet/mvc/filters","01.csharp/11.aspnet/11.mvc/07.filters",{"title":1246,"path":1247,"stem":1248},"Areas: структурування великих застосунків","/csharp/aspnet/mvc/areas","01.csharp/11.aspnet/11.mvc/08.areas",{"title":1250,"path":1251,"stem":1252},"View Components: повторювані незалежні блоки UI","/csharp/aspnet/mvc/view-components","01.csharp/11.aspnet/11.mvc/09.view-components",{"title":1254,"path":1255,"stem":1256},"Display та Editor Templates","/csharp/aspnet/mvc/display-editor-templates","01.csharp/11.aspnet/11.mvc/10.display-editor-templates",{"title":1258,"path":1259,"stem":1260},"Валідація: IValidatableObject та FluentValidation","/csharp/aspnet/mvc/validation-advanced","01.csharp/11.aspnet/11.mvc/11.validation-advanced",{"title":1262,"path":1263,"stem":1264},"HTMX: інтерактивність через HTML-атрибути","/csharp/aspnet/mvc/htmx","01.csharp/11.aspnet/11.mvc/12.htmx",{"title":1266,"path":1267,"stem":1268},"HTMX у ASP.NET Core MVC: серверна інтеграція","/csharp/aspnet/mvc/ajax-htmx-mvc","01.csharp/11.aspnet/11.mvc/13.ajax-htmx-mvc",{"title":1270,"path":1271,"stem":1272},"Практичний проєкт: Каталог товарів з HTMX","/csharp/aspnet/mvc/htmx-project","01.csharp/11.aspnet/11.mvc/14.htmx-project",{"title":1274,"path":1275,"stem":1276},"Завантаження та обробка файлів","/csharp/aspnet/mvc/file-upload","01.csharp/11.aspnet/11.mvc/15.file-upload",{"title":1278,"path":1279,"stem":1280},"Глобалізація та Локалізація MVC","/csharp/aspnet/mvc/globalization-localization","01.csharp/11.aspnet/11.mvc/16.globalization-localization",{"title":1282,"path":1283,"stem":1284},"Підсумковий проєкт: Блог-платформа","/csharp/aspnet/mvc/mvc-project","01.csharp/11.aspnet/11.mvc/17.mvc-project",{"title":1286,"path":1287,"stem":1288},"План курсу: ASP.NET Core MVC","/csharp/aspnet/mvc/plan","01.csharp/11.aspnet/11.mvc/plan",{"title":1290,"path":1291,"stem":1292,"children":1293,"page":59},"Web Api","/csharp/aspnet/web-api","01.csharp/11.aspnet/12.web-api",[1294,1298,1302,1306,1310,1314,1318,1322,1326,1330,1334,1338,1342],{"title":1295,"path":1296,"stem":1297},"Від Minimal API до Controller-based API","/csharp/aspnet/web-api/from-minimal-api-to-controllers","01.csharp/11.aspnet/12.web-api/01.from-minimal-api-to-controllers",{"title":1299,"path":1300,"stem":1301},"ControllerBase, ActionResult\u003CT> та Response Types","/csharp/aspnet/web-api/controller-base-actionresult","01.csharp/11.aspnet/12.web-api/02.controller-base-actionresult",{"title":1303,"path":1304,"stem":1305},"Content Negotiation - JSON, XML та власні форматери","/csharp/aspnet/web-api/content-negotiation","01.csharp/11.aspnet/12.web-api/03.content-negotiation",{"title":1307,"path":1308,"stem":1309},"Версіонування API","/csharp/aspnet/web-api/api-versioning","01.csharp/11.aspnet/12.web-api/04.api-versioning",{"title":1311,"path":1312,"stem":1313},"ProblemDetails та структурована обробка помилок","/csharp/aspnet/web-api/problemdetails-error-handling","01.csharp/11.aspnet/12.web-api/05.problemdetails-error-handling",{"title":1315,"path":1316,"stem":1317},"Фільтри у Web API контексті","/csharp/aspnet/web-api/filters-for-api","01.csharp/11.aspnet/12.web-api/06.filters-for-api",{"title":1319,"path":1320,"stem":1321},"Пагінація, фільтрація та сортування","/csharp/aspnet/web-api/pagination-filtering-sorting","01.csharp/11.aspnet/12.web-api/07.pagination-filtering-sorting",{"title":1323,"path":1324,"stem":1325},"HATEOAS та Resource Expansion","/csharp/aspnet/web-api/hateoas-resource-expansion","01.csharp/11.aspnet/12.web-api/08.hateoas-resource-expansion",{"title":1327,"path":1328,"stem":1329},"Гібридна архітектура - Minimal API + Controllers","/csharp/aspnet/web-api/minimal-api-vs-controllers-hybrid","01.csharp/11.aspnet/12.web-api/09.minimal-api-vs-controllers-hybrid",{"title":1331,"path":1332,"stem":1333},"Документація API - Swashbuckle, NSwag та генерація клієнтів","/csharp/aspnet/web-api/api-documentation-generation","01.csharp/11.aspnet/12.web-api/10.api-documentation-generation",{"title":1335,"path":1336,"stem":1337},"Health Checks та моніторинг API","/csharp/aspnet/web-api/health-checks-monitoring","01.csharp/11.aspnet/12.web-api/11.health-checks-monitoring",{"title":1339,"path":1340,"stem":1341},"Підсумковий проєкт - Production-Ready REST API","/csharp/aspnet/web-api/web-api-project","01.csharp/11.aspnet/12.web-api/12.web-api-project",{"title":1343,"path":1344,"stem":1345},"План курсу: ASP.NET Core Web API (Controllers)","/csharp/aspnet/web-api/plan","01.csharp/11.aspnet/12.web-api/plan",{"title":1347,"icon":1348,"path":1349,"stem":1350,"children":1351,"page":59},"Desktop UI","i-lucide-app-window","/csharp/desktop-ui","01.csharp/12.desktop-ui",[1352,1356,1360,1364,1368,1372,1376,1380,1384,1388,1392,1396,1400,1404,1408,1412,1416,1420,1424,1428,1432,1436,1440,1444,1448,1452,1456,1460,1464,1468,1472,1476,1480,1484,1488,1492,1496,1500,1504,1508,1512,1516,1520,1524,1528,1532,1536,1540,1544,1548,1552,1556,1560,1564,1568,1572,1576,1580,1584,1588,1592,1596,1600,1604,1608,1612,1616,1620,1624,1628,1632],{"title":1353,"path":1354,"stem":1355},"Що таке десктопна розробка?","/csharp/desktop-ui/what-is-desktop-dev","01.csharp/12.desktop-ui/01.what-is-desktop-dev",{"title":1357,"path":1358,"stem":1359},"Архітектура WPF — як влаштований графічний інтерфейс","/csharp/desktop-ui/wpf-architecture","01.csharp/12.desktop-ui/02.wpf-architecture",{"title":1361,"path":1362,"stem":1363},"Перший WPF-проєкт — від нуля до вікна","/csharp/desktop-ui/first-wpf-app","01.csharp/12.desktop-ui/03.first-wpf-app",{"title":1365,"path":1366,"stem":1367},"Перший Avalonia-проєкт: WPF для всіх платформ","/csharp/desktop-ui/03a.first-avalonia-app","01.csharp/12.desktop-ui/03a.first-avalonia-app",{"title":1369,"path":1370,"stem":1371},"XAML: декларативний інтерфейс","/csharp/desktop-ui/xaml-basics","01.csharp/12.desktop-ui/04.xaml-basics",{"title":1373,"path":1374,"stem":1375},"Fluent UI у WPF — сучасний дизайн Windows 11","/csharp/desktop-ui/04a.wpf-fluent-ui","01.csharp/12.desktop-ui/04a.wpf-fluent-ui",{"title":1377,"path":1378,"stem":1379},"WPF UI — сучасна бібліотека Fluent контролів","/csharp/desktop-ui/04b.wpf-ui-library","01.csharp/12.desktop-ui/04b.wpf-ui-library",{"title":1381,"path":1382,"stem":1383},"HandyControl — велика бібліотека UI контролів для WPF","/csharp/desktop-ui/04c.handycontrol-library","01.csharp/12.desktop-ui/04c.handycontrol-library",{"title":1385,"path":1386,"stem":1387},"Простори імен та ресурси XAML","/csharp/desktop-ui/xaml-namespaces-resources","01.csharp/12.desktop-ui/05.xaml-namespaces-resources",{"title":1389,"path":1390,"stem":1391},"XAML в Avalonia: ключові відмінності від WPF","/csharp/desktop-ui/05a.avalonia-xaml-differences","01.csharp/12.desktop-ui/05a.avalonia-xaml-differences",{"title":1393,"path":1394,"stem":1395},"Розширення розмітки XAML (Markup Extensions)","/csharp/desktop-ui/xaml-markup-extensions","01.csharp/12.desktop-ui/06.xaml-markup-extensions",{"title":1397,"path":1398,"stem":1399},"Панелі Layout: StackPanel, WrapPanel, DockPanel","/csharp/desktop-ui/layout-panels-part1","01.csharp/12.desktop-ui/07.layout-panels-part1",{"title":1401,"path":1402,"stem":1403},"Grid, Canvas, UniformGrid","/csharp/desktop-ui/layout-panels-part2","01.csharp/12.desktop-ui/07.layout-panels-part2",{"title":1405,"path":1406,"stem":1407},"Просунуті техніки Layout","/csharp/desktop-ui/layout-advanced","01.csharp/12.desktop-ui/08.layout-advanced",{"title":1409,"path":1410,"stem":1411},"Адаптивний Layout та найкращі практики","/csharp/desktop-ui/layout-responsive","01.csharp/12.desktop-ui/09.layout-responsive",{"title":1413,"path":1414,"stem":1415},"Layout в Avalonia: відмінності та нові можливості","/csharp/desktop-ui/09a.layout-avalonia","01.csharp/12.desktop-ui/09a.layout-avalonia",{"title":1417,"path":1418,"stem":1419},"Button, Image, ProgressBar та інші базові контроли","/csharp/desktop-ui/basic-controls","01.csharp/12.desktop-ui/10.basic-controls",{"title":1421,"path":1422,"stem":1423},"Контроли в Avalonia: відмінності від WPF","/csharp/desktop-ui/10a.controls-avalonia","01.csharp/12.desktop-ui/10a.controls-avalonia",{"title":1425,"path":1426,"stem":1427},"Текстові контроли — TextBlock, TextBox, RichTextBox","/csharp/desktop-ui/text-controls","01.csharp/12.desktop-ui/11.text-controls",{"title":1429,"path":1430,"stem":1431},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","/csharp/desktop-ui/selection-controls","01.csharp/12.desktop-ui/12.selection-controls",{"title":1433,"path":1434,"stem":1435},"Content Model — GroupBox, Expander, TabControl, StatusBar","/csharp/desktop-ui/content-controls","01.csharp/12.desktop-ui/13.content-controls",{"title":1437,"path":1438,"stem":1439},"UI/UX принципи десктопних застосунків","/csharp/desktop-ui/13a.ui-ux-principles","01.csharp/12.desktop-ui/13a.ui-ux-principles",{"title":1441,"path":1442,"stem":1443},"Dependency Properties — Концепція та Value Resolution","/csharp/desktop-ui/dependency-properties-part1","01.csharp/12.desktop-ui/14.dependency-properties-part1",{"title":1445,"path":1446,"stem":1447},"Avalonia Property System — StyledProperty та DirectProperty","/csharp/desktop-ui/14a.avalonia-property-system","01.csharp/12.desktop-ui/14a.avalonia-property-system",{"title":1449,"path":1450,"stem":1451},"Attached Properties — Властивості без меж","/csharp/desktop-ui/attached-properties","01.csharp/12.desktop-ui/15.attached-properties",{"title":1453,"path":1454,"stem":1455},"Routed Events — Маршрутизація подій у WPF","/csharp/desktop-ui/routed-events","01.csharp/12.desktop-ui/16.routed-events",{"title":1457,"path":1458,"stem":1459},"Data Binding — Від Code-Behind до Декларативності","/csharp/desktop-ui/data-binding-basics-part1","01.csharp/12.desktop-ui/17.data-binding-basics-part1",{"title":1461,"path":1462,"stem":1463},"INotifyPropertyChanged — Живе оновлення UI","/csharp/desktop-ui/data-binding-basics-part2","01.csharp/12.desktop-ui/17.data-binding-basics-part2",{"title":1465,"path":1466,"stem":1467},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","/csharp/desktop-ui/17a.avalonia-compiled-bindings","01.csharp/12.desktop-ui/17a.avalonia-compiled-bindings",{"title":1469,"path":1470,"stem":1471},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","/csharp/desktop-ui/data-binding-advanced","01.csharp/12.desktop-ui/18.data-binding-advanced",{"title":1473,"path":1474,"stem":1475},"Value Converters — Перетворення типів даних у Data Binding","/csharp/desktop-ui/value-converters","01.csharp/12.desktop-ui/19.value-converters",{"title":1477,"path":1478,"stem":1479},"Data Templates — Візуалізація об'єктів у WPF","/csharp/desktop-ui/data-templates","01.csharp/12.desktop-ui/20.data-templates",{"title":1481,"path":1482,"stem":1483},"Collections Binding Part 1 — ObservableCollection та ItemsControl","/csharp/desktop-ui/collections-binding-part1","01.csharp/12.desktop-ui/21.collections-binding-part1",{"title":1485,"path":1486,"stem":1487},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","/csharp/desktop-ui/collections-binding-part2","01.csharp/12.desktop-ui/21.collections-binding-part2",{"title":1489,"path":1490,"stem":1491},"MVVM Pattern — Від Spaghetti Code до архітектури","/csharp/desktop-ui/mvvm-pattern","01.csharp/12.desktop-ui/22.mvvm-pattern",{"title":1493,"path":1494,"stem":1495},"ViewModel Implementation — Від BaseViewModel до валідації","/csharp/desktop-ui/viewmodel-implementation","01.csharp/12.desktop-ui/23.viewmodel-implementation",{"title":1497,"path":1498,"stem":1499},"Commands — Від event handlers до декларативних команд","/csharp/desktop-ui/commands","01.csharp/12.desktop-ui/24.commands",{"title":1501,"path":1502,"stem":1503},"MVVM Toolkit — MVVM без boilerplate через Source Generators","/csharp/desktop-ui/mvvm-toolkit","01.csharp/12.desktop-ui/25.mvvm-toolkit",{"title":1505,"path":1506,"stem":1507},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","/csharp/desktop-ui/messenger-pattern","01.csharp/12.desktop-ui/26.messenger-pattern",{"title":1509,"path":1510,"stem":1511},"Стилі WPF — CSS для десктопу","/csharp/desktop-ui/styles-basics","01.csharp/12.desktop-ui/27.styles-basics",{"title":1513,"path":1514,"stem":1515},"CSS-like стилі Avalonia","/csharp/desktop-ui/27a.avalonia-css-styling","01.csharp/12.desktop-ui/27a.avalonia-css-styling",{"title":1517,"path":1518,"stem":1519},"Control Templates — Частина 1. Концепція та TemplateBinding","/csharp/desktop-ui/control-templates-part1","01.csharp/12.desktop-ui/28.control-templates-part1",{"title":1521,"path":1522,"stem":1523},"Control Templates — Частина 2. Named Parts та ContentPresenter","/csharp/desktop-ui/control-templates-part2","01.csharp/12.desktop-ui/28.control-templates-part2",{"title":1525,"path":1526,"stem":1527},"Control Themes в Avalonia — нова ера стилізації","/csharp/desktop-ui/28a.avalonia-control-themes","01.csharp/12.desktop-ui/28a.avalonia-control-themes",{"title":1529,"path":1530,"stem":1531},"Triggers та Visual State Manager у WPF","/csharp/desktop-ui/triggers-visual-states","01.csharp/12.desktop-ui/29.triggers-visual-states",{"title":1533,"path":1534,"stem":1535},"Pseudo-classes в Avalonia — замість WPF Triggers","/csharp/desktop-ui/29a.avalonia-pseudo-classes","01.csharp/12.desktop-ui/29a.avalonia-pseudo-classes",{"title":1537,"path":1538,"stem":1539},"Теми та ресурсні словники у WPF","/csharp/desktop-ui/resources-themes","01.csharp/12.desktop-ui/30.resources-themes",{"title":1541,"path":1542,"stem":1543},"Avalonia Themes — Fluent Design та система тематизації","/csharp/desktop-ui/30a.avalonia-themes-fluent","01.csharp/12.desktop-ui/30a.avalonia-themes-fluent",{"title":1545,"path":1546,"stem":1547},"Контроли колекцій — глибоке занурення","/csharp/desktop-ui/collection-controls","01.csharp/12.desktop-ui/31.collection-controls",{"title":1549,"path":1550,"stem":1551},"DataGrid — колонки та базове відображення","/csharp/desktop-ui/datagrid-part1","01.csharp/12.desktop-ui/32.datagrid-part1",{"title":1553,"path":1554,"stem":1555},"DataGrid — сортування, фільтрація, редагування","/csharp/desktop-ui/datagrid-part2","01.csharp/12.desktop-ui/32.datagrid-part2",{"title":1557,"path":1558,"stem":1559},"TreeView та GridView","/csharp/desktop-ui/treeview-listview","01.csharp/12.desktop-ui/33.treeview-listview",{"title":1561,"path":1562,"stem":1563},"Меню, Toolbar, ContextMenu, StatusBar","/csharp/desktop-ui/menus-toolbars","01.csharp/12.desktop-ui/34.menus-toolbars",{"title":1565,"path":1566,"stem":1567},"Навігація та керування вікнами. Частина 1: вікна та сторінки","/csharp/desktop-ui/navigation-windows-part1","01.csharp/12.desktop-ui/35.navigation-windows-part1",{"title":1569,"path":1570,"stem":1571},"Навігація та керування вікнами. Частина 2: MVVM-навігація","/csharp/desktop-ui/navigation-windows-part2","01.csharp/12.desktop-ui/35.navigation-windows-part2",{"title":1573,"path":1574,"stem":1575},"Avalonia — Навігація та діалоги","/csharp/desktop-ui/35a.avalonia-navigation-dialogs","01.csharp/12.desktop-ui/35a.avalonia-navigation-dialogs",{"title":1577,"path":1578,"stem":1579},"Діалоги та File Pickers у WPF","/csharp/desktop-ui/dialogs-file-pickers","01.csharp/12.desktop-ui/36.dialogs-file-pickers",{"title":1581,"path":1582,"stem":1583},"UserControl: компонентний підхід у WPF","/csharp/desktop-ui/user-controls","01.csharp/12.desktop-ui/37.user-controls",{"title":1585,"path":1586,"stem":1587},"Custom Controls: Lookless Controls у WPF","/csharp/desktop-ui/custom-controls","01.csharp/12.desktop-ui/38.custom-controls",{"title":1589,"path":1590,"stem":1591},"Avalonia TemplatedControl — Lookless Controls","/csharp/desktop-ui/38a.avalonia-templated-controls","01.csharp/12.desktop-ui/38a.avalonia-templated-controls",{"title":1593,"path":1594,"stem":1595},"Анімації у WPF: Storyboard та Easing Functions","/csharp/desktop-ui/animations-transitions","01.csharp/12.desktop-ui/39.animations-transitions",{"title":1597,"path":1598,"stem":1599},"Анімації в Avalonia","/csharp/desktop-ui/39a.avalonia-animations","01.csharp/12.desktop-ui/39a.avalonia-animations",{"title":1601,"path":1602,"stem":1603},"2D Графіка та Мультимедіа у WPF","/csharp/desktop-ui/media-graphics","01.csharp/12.desktop-ui/40.media-graphics",{"title":1605,"path":1606,"stem":1607},"Dependency Injection у WPF та Avalonia","/csharp/desktop-ui/di-integration","01.csharp/12.desktop-ui/41.di-integration",{"title":1609,"path":1610,"stem":1611},"SQLite та EF Core у десктопних додатках","/csharp/desktop-ui/data-persistence-part1","01.csharp/12.desktop-ui/42.data-persistence-part1",{"title":1613,"path":1614,"stem":1615},"Repository Pattern та Unit of Work","/csharp/desktop-ui/data-persistence-part2","01.csharp/12.desktop-ui/43.data-persistence-part2",{"title":1617,"path":1618,"stem":1619},"Тестування ViewModels","/csharp/desktop-ui/viewmodel-testing","01.csharp/12.desktop-ui/44.viewmodel-testing",{"title":1621,"path":1622,"stem":1623},"Avalonia Headless Testing — тестування UI без вікон","/csharp/desktop-ui/44a.avalonia-headless-testing","01.csharp/12.desktop-ui/44a.avalonia-headless-testing",{"title":1625,"path":1626,"stem":1627},"Кросплатформна розробка з Avalonia","/csharp/desktop-ui/avalonia-cross-platform","01.csharp/12.desktop-ui/45.avalonia-cross-platform",{"title":1629,"path":1630,"stem":1631},"Пакування та розгортання Avalonia додатків","/csharp/desktop-ui/avalonia-packaging-deployment","01.csharp/12.desktop-ui/46.avalonia-packaging-deployment",{"title":1633,"path":1634,"stem":1635},"Розгортання WPF застосунків","/csharp/desktop-ui/wpf-packaging-deployment","01.csharp/12.desktop-ui/47.wpf-packaging-deployment",{"title":1637,"path":1638,"stem":1639},"C# & .NET: The Ultimate Roadmap","/csharp/roadmap","01.csharp/roadmap",{"title":1641,"icon":1642,"path":1643,"stem":1644,"children":1645,"page":59},"C++","i-devicon-cplusplus","/cpp","02.cpp",[1646,1650,1654,1658,1662,1666,1670,1674,1678,1681,1685,1689,1693,1697,1701,1705,1709,1713,1717,1721,1725,1729,1733,1737,1741,1745,1749,1753,1757,1761],{"title":1647,"path":1648,"stem":1649},"Вступ у програмування та алгоритми","/cpp/intro-algorithms","02.cpp/01.intro-algorithms",{"title":1651,"path":1652,"stem":1653},"Code Style: угоди про оформлення коду","/cpp/code-style","02.cpp/02.code-style",{"title":1655,"path":1656,"stem":1657},"Середовище розробки та перший проєкт","/cpp/ide-setup","02.cpp/03.ide-setup",{"title":1659,"path":1660,"stem":1661},"Вивід даних на екран","/cpp/data-output","02.cpp/04.data-output",{"title":1663,"path":1664,"stem":1665},"Типи даних, змінні та константи","/cpp/data-types-variables","02.cpp/05.data-types-variables",{"title":1667,"path":1668,"stem":1669},"Ввід даних з клавіатури","/cpp/data-input","02.cpp/06.data-input",{"title":1671,"path":1672,"stem":1673},"Оператори, перетворення типів та логічні операції","/cpp/operators-type-conversion","02.cpp/07.operators-type-conversion",{"title":1675,"path":1676,"stem":1677},"Цикли","/cpp/loops","02.cpp/08.loops",{"title":32,"path":1679,"stem":1680},"/cpp/arrays","02.cpp/09.arrays",{"title":1682,"path":1683,"stem":1684},"Алгоритми сортування та аналіз складності","/cpp/sorting","02.cpp/10.sorting",{"title":1686,"path":1687,"stem":1688},"Алгоритми пошуку","/cpp/searching","02.cpp/11.searching",{"title":1690,"path":1691,"stem":1692},"Функції: основи","/cpp/functions-basics","02.cpp/12.functions-basics",{"title":1694,"path":1695,"stem":1696},"Функції: прототипи, область видимості та додаткові можливості","/cpp/functions-scope","02.cpp/13.functions-scope",{"title":1698,"path":1699,"stem":1700},"Функції: перевантаження та шаблони","/cpp/functions-overloading-templates","02.cpp/14.functions-overloading-templates",{"title":1702,"path":1703,"stem":1704},"Вказівники: основи","/cpp/pointers-basics","02.cpp/15.pointers-basics",{"title":1706,"path":1707,"stem":1708},"Посилання (References)","/cpp/references","02.cpp/16.references",{"title":1710,"path":1711,"stem":1712},"Вказівники, const і масиви","/cpp/pointers-const-arrays","02.cpp/17.pointers-const-arrays",{"title":1714,"path":1715,"stem":1716},"Адресна арифметика","/cpp/pointer-arithmetic","02.cpp/18.pointer-arithmetic",{"title":1718,"path":1719,"stem":1720},"Динамічна пам'ять","/cpp/dynamic-memory","02.cpp/19.dynamic-memory",{"title":1722,"path":1723,"stem":1724},"Вказівники типу void","/cpp/void-pointers","02.cpp/20.void-pointers",{"title":1726,"path":1727,"stem":1728},"Вказівники на вказівники","/cpp/pointers-to-pointers","02.cpp/21.pointers-to-pointers",{"title":1730,"path":1731,"stem":1732},"Оператор доступу до членів через вказівник (->)","/cpp/member-access-operator","02.cpp/22.member-access-operator",{"title":1734,"path":1735,"stem":1736},"Цикл for-each (Range-based for)","/cpp/foreach-loop","02.cpp/23.foreach-loop",{"title":1738,"path":1739,"stem":1740},"Вказівники на функції","/cpp/function-pointers","02.cpp/24.function-pointers",{"title":1742,"path":1743,"stem":1744},"Лямбда-вирази","/cpp/lambdas","02.cpp/25.lambdas",{"title":1746,"path":1747,"stem":1748},"Лямбда-захоплення","/cpp/lambda-captures","02.cpp/26.lambda-captures",{"title":1750,"path":1751,"stem":1752},"Еліпсис","/cpp/ellipsis","02.cpp/27.ellipsis",{"title":1754,"path":1755,"stem":1756},"Аргументи командного рядка","/cpp/command-line-arguments","02.cpp/28.command-line-arguments",{"title":1758,"path":1759,"stem":1760},"Перерахування (enum)","/cpp/enum","02.cpp/29.enum",{"title":1762,"path":1763,"stem":1764},"План навчання: Курс C++ — Продовження (Статті 29–60+)","/cpp/curriculum-plan","02.cpp/curriculum-plan",{"title":1766,"icon":1767,"path":1768,"stem":1769,"children":1770,"page":59},"JavaScript","i-devicon-javascript","/javascript","03.javascript",[1771,1797,1851,1873,2177,2215],{"title":1772,"icon":1773,"path":1774,"stem":1775,"children":1776,"page":59},"Events","i-lucide-mouse-pointer-click","/javascript/events","03.javascript/01.events",[1777,1781,1785,1789,1793],{"title":1778,"path":1779,"stem":1780},"Вступ до подій браузера","/javascript/events/intro","03.javascript/01.events/01.intro",{"title":1782,"path":1783,"stem":1784},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","/javascript/events/bubbling-capturing","03.javascript/01.events/02.bubbling-capturing",{"title":1786,"path":1787,"stem":1788},"Делегування подій (Event Delegation)","/javascript/events/delegate-events","03.javascript/01.events/03.delegate-events",{"title":1790,"path":1791,"stem":1792},"Типові дії браузера та preventDefault()","/javascript/events/prevent-default","03.javascript/01.events/04.prevent-default",{"title":1794,"path":1795,"stem":1796},"Запуск користувацьких подій (Custom Events)","/javascript/events/custom-events","03.javascript/01.events/05.custom-events",{"title":1798,"icon":1799,"path":1800,"stem":1801,"children":1802,"page":59},"Network","i-lucide-globe","/javascript/network","03.javascript/02.network",[1803,1807,1811,1815,1819,1823,1827,1831,1835,1839,1843,1847],{"title":1804,"path":1805,"stem":1806},"Fetch API - Сучасний підхід до HTTP-запитів","/javascript/network/01-fetch-api","03.javascript/02.network/01-fetch-api",{"title":1808,"path":1809,"stem":1810},"FormData - Робота з формами та файлами","/javascript/network/02-formdata","03.javascript/02.network/02-formdata",{"title":1812,"path":1813,"stem":1814},"Відстеження прогресу завантаження","/javascript/network/03-download-progress","03.javascript/02.network/03-download-progress",{"title":1816,"path":1817,"stem":1818},"Переривання fetch-запитів","/javascript/network/04-abort-requests","03.javascript/02.network/04-abort-requests",{"title":1820,"path":1821,"stem":1822},"CORS - Запити між різними джерелами","/javascript/network/05-cors","03.javascript/02.network/05-cors",{"title":1824,"path":1825,"stem":1826},"Fetch API - Повний довідник опцій","/javascript/network/06-fetch-options","03.javascript/02.network/06-fetch-options",{"title":1828,"path":1829,"stem":1830},"URL Objects - Робота з посиланнями","/javascript/network/07-url-objects","03.javascript/02.network/07-url-objects",{"title":1832,"path":1833,"stem":1834},"XMLHttpRequest - AJAX та низькорівневі запити","/javascript/network/08-xmlhttprequest","03.javascript/02.network/08-xmlhttprequest",{"title":1836,"path":1837,"stem":1838},"Відновлюване завантаження файлів","/javascript/network/09-resumable-upload","03.javascript/02.network/09-resumable-upload",{"title":1840,"path":1841,"stem":1842},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","/javascript/network/10-cookies","03.javascript/02.network/10-cookies",{"title":1844,"path":1845,"stem":1846},"js-cookie: Керування Cookies без Болю","/javascript/network/11-js-cookie","03.javascript/02.network/11-js-cookie",{"title":1848,"path":1849,"stem":1850},"Axios: Потужний HTTP-клієнт для JavaScript","/javascript/network/12-axios","03.javascript/02.network/12-axios",{"title":1852,"icon":1853,"path":1854,"stem":1855,"children":1856,"page":59},"Bom","i-lucide-monitor","/javascript/bom","03.javascript/03.bom",[1857,1861,1865,1869],{"title":1858,"path":1859,"stem":1860},"LocalStorage, SessionStorage та patterns збереження даних","/javascript/bom/01-localstorage","03.javascript/03.bom/01-localstorage",{"title":1862,"path":1863,"stem":1864},"Location Object - Керування адресою сторінки","/javascript/bom/02-location-object","03.javascript/03.bom/02-location-object",{"title":1866,"path":1867,"stem":1868},"History API - Керування історією браузера","/javascript/bom/03-history-api","03.javascript/03.bom/03-history-api",{"title":1870,"path":1871,"stem":1872},"Navigator Object - Ідентифікація та Можливості Пристрою","/javascript/bom/04-navigator-object","03.javascript/03.bom/04-navigator-object",{"title":1874,"icon":1875,"path":1876,"stem":1877,"children":1878},"React","i-devicon-react","/javascript/react","03.javascript/04.react/index",[1879,1880,1884,1888,1892,1896,1959,1994,2146],{"title":1874,"path":1876,"stem":1877},{"title":1881,"path":1882,"stem":1883},"Робота з Формами в React","/javascript/react/react-forms","03.javascript/04.react/01.react-forms",{"title":1885,"path":1886,"stem":1887},"React Hook Form: Професійна Робота з Формами","/javascript/react/react-hook-form","03.javascript/04.react/02.react-hook-form",{"title":1889,"path":1890,"stem":1891},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","/javascript/react/react-hook-form-new","03.javascript/04.react/02.react-hook-form-new",{"title":1893,"path":1894,"stem":1895},"Axios та React: Професійна Архітектура Запитів","/javascript/react/data-fetching-axios","03.javascript/04.react/03.data-fetching-axios",{"title":1897,"icon":132,"path":1898,"stem":1899,"children":1900},"Tanstack Query","/javascript/react/tanstack-query","03.javascript/04.react/04.tanstack-query/index",[1901,1903,1907,1911,1915,1919,1923,1927,1931,1935,1939,1943,1947,1951,1955],{"title":1902,"path":1898,"stem":1899},"TanStack Query: Майстерність Керування Станом Сервера",{"title":1904,"path":1905,"stem":1906},"Парадигма Server State: Чому useEffect недостатньо","/javascript/react/tanstack-query/server-state-paradigm","03.javascript/04.react/04.tanstack-query/01.server-state-paradigm",{"title":1908,"path":1909,"stem":1910},"Встановлення та Налаштування: Фундамент","/javascript/react/tanstack-query/installation-and-devtools","03.javascript/04.react/04.tanstack-query/02.installation-and-devtools",{"title":1912,"path":1913,"stem":1914},"Основи Запитів та Магія Ключів","/javascript/react/tanstack-query/query-basics-and-keys","03.javascript/04.react/04.tanstack-query/03.query-basics-and-keys",{"title":1916,"path":1917,"stem":1918},"Синхронізація Даних: Життєвий Цикл Запиту","/javascript/react/tanstack-query/data-synchronization","03.javascript/04.react/04.tanstack-query/04.data-synchronization",{"title":1920,"path":1921,"stem":1922},"Мутації та Інвалідація: Зміна Даних","/javascript/react/tanstack-query/mutations-and-invalidation","03.javascript/04.react/04.tanstack-query/05.mutations-and-invalidation",{"title":1924,"path":1925,"stem":1926},"Оптимістичні Оновлення: Швидше за Світло","/javascript/react/tanstack-query/optimistic-updates","03.javascript/04.react/04.tanstack-query/06.optimistic-updates",{"title":1928,"path":1929,"stem":1930},"Пагінація та Infinite Scroll","/javascript/react/tanstack-query/pagination-and-load-more","03.javascript/04.react/04.tanstack-query/07.pagination-and-load-more",{"title":1932,"path":1933,"stem":1934},"Просунуті Патерни та Оптимізація","/javascript/react/tanstack-query/advanced-patterns","03.javascript/04.react/04.tanstack-query/08.advanced-patterns",{"title":1936,"path":1937,"stem":1938},"Архітектура та Best Practices","/javascript/react/tanstack-query/architecture-and-best-practices","03.javascript/04.react/04.tanstack-query/09.architecture-and-best-practices",{"title":1940,"path":1941,"stem":1942},"Server-Side Rendering (SSR) та Гідратація","/javascript/react/tanstack-query/server-side-rendering","03.javascript/04.react/04.tanstack-query/10.server-side-rendering",{"title":1944,"path":1945,"stem":1946},"Стратегії Тестування","/javascript/react/tanstack-query/testing-strategies","03.javascript/04.react/04.tanstack-query/11.testing-strategies",{"title":1948,"path":1949,"stem":1950},"Аутентифікація та Обробка Помилок","/javascript/react/tanstack-query/authentication-and-errors","03.javascript/04.react/04.tanstack-query/12.authentication-and-errors",{"title":1952,"path":1953,"stem":1954},"React Suspense та Майбутнє","/javascript/react/tanstack-query/react-suspense","03.javascript/04.react/04.tanstack-query/13.react-suspense",{"title":1956,"path":1957,"stem":1958},"Глибоке Занурення в Продуктивність","/javascript/react/tanstack-query/performance-deep-dive","03.javascript/04.react/04.tanstack-query/14.performance-deep-dive",{"title":1960,"icon":1875,"path":1961,"stem":1962,"children":1963},"React Router","/javascript/react/react-router","03.javascript/04.react/05.react-router/index",[1964,1966,1970,1974,1978,1982,1986,1990],{"title":1965,"path":1961,"stem":1962},"React Router: Навігаційна система сучасного вебу",{"title":1967,"path":1968,"stem":1969},"Налаштування та Базовий Роутинг","/javascript/react/react-router/setup-and-basic-routing","03.javascript/04.react/05.react-router/01.setup-and-basic-routing",{"title":1971,"path":1972,"stem":1973},"Динамічна Навігація","/javascript/react/react-router/navigation-and-links","03.javascript/04.react/05.react-router/02.navigation-and-links",{"title":1975,"path":1976,"stem":1977},"Вкладені Маршрути та Макети","/javascript/react/react-router/nested-routes-and-layouts","03.javascript/04.react/05.react-router/03.nested-routes-and-layouts",{"title":1979,"path":1980,"stem":1981},"Динамічні Маршрути та Параметри","/javascript/react/react-router/dynamic-routing","03.javascript/04.react/05.react-router/04.dynamic-routing",{"title":1983,"path":1984,"stem":1985},"Data APIs: Loaders та Actions","/javascript/react/react-router/data-loading","03.javascript/04.react/05.react-router/05.data-loading",{"title":1987,"path":1988,"stem":1989},"Просунуті Патерни","/javascript/react/react-router/advanced-patterns","03.javascript/04.react/05.react-router/06.advanced-patterns",{"title":1991,"path":1992,"stem":1993},"Legacy Routing: Компонентний підхід","/javascript/react/react-router/legacy-routing","03.javascript/04.react/05.react-router/07.legacy-routing",{"title":1995,"icon":132,"path":1996,"stem":1997,"children":1998},"Redux","/javascript/react/redux","03.javascript/04.react/06.redux/index",[1999,2001,2017,2046,2055,2076,2092,2121],{"title":2000,"path":1996,"stem":1997},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2002,"stem":2003,"children":2004,"page":59},"/javascript/react/redux/fundamentals","03.javascript/04.react/06.redux/01.fundamentals",[2005,2009,2013],{"title":2006,"path":2007,"stem":2008},"Вступ до State Management","/javascript/react/redux/fundamentals/intro-state-management","03.javascript/04.react/06.redux/01.fundamentals/01.intro-state-management",{"title":2010,"path":2011,"stem":2012},"Філософія Redux та Три Принципи","/javascript/react/redux/fundamentals/redux-philosophy","03.javascript/04.react/06.redux/01.fundamentals/02.redux-philosophy",{"title":2014,"path":2015,"stem":2016},"Чисті функції та Іммутабельність","/javascript/react/redux/fundamentals/pure-functions-immutability","03.javascript/04.react/06.redux/01.fundamentals/03.pure-functions-immutability",{"title":2018,"icon":132,"path":2019,"stem":2020,"children":2021,"page":59},"Classic Redux","/javascript/react/redux/classic-redux","03.javascript/04.react/06.redux/02.classic-redux",[2022,2026,2030,2034,2038,2042],{"title":2023,"path":2024,"stem":2025},"Створення Store (Classic Redux)","/javascript/react/redux/classic-redux/store-setup","03.javascript/04.react/06.redux/02.classic-redux/01.store-setup",{"title":2027,"path":2028,"stem":2029},"Actions, Constants та Action Creators","/javascript/react/redux/classic-redux/actions-constants","03.javascript/04.react/06.redux/02.classic-redux/02.actions-constants",{"title":2031,"path":2032,"stem":2033},"Логіка Reducers","/javascript/react/redux/classic-redux/reducers","03.javascript/04.react/06.redux/02.classic-redux/03.reducers",{"title":2035,"path":2036,"stem":2037},"Комбінування Reducers (Root Reducer)","/javascript/react/redux/classic-redux/data-flow","03.javascript/04.react/06.redux/02.classic-redux/04.data-flow",{"title":2039,"path":2040,"stem":2041},"Підключення до React (React-Redux)","/javascript/react/redux/classic-redux/react-redux-connection","03.javascript/04.react/06.redux/02.classic-redux/05.react-redux-connection",{"title":2043,"path":2044,"stem":2045},"Middleware та Асинхронність (Redux Thunk)","/javascript/react/redux/classic-redux/middleware-thunk","03.javascript/04.react/06.redux/02.classic-redux/06.middleware-thunk",{"title":2047,"icon":132,"path":2048,"stem":2049,"children":2050,"page":59},"Transition To Rtk","/javascript/react/redux/transition-to-rtk","03.javascript/04.react/06.redux/03.transition-to-rtk",[2051],{"title":2052,"path":2053,"stem":2054},"Проблеми класичного Redux","/javascript/react/redux/transition-to-rtk/problems-with-classic","03.javascript/04.react/06.redux/03.transition-to-rtk/01.problems-with-classic",{"title":2056,"icon":132,"path":2057,"stem":2058,"children":2059,"page":59},"Redux Toolkit","/javascript/react/redux/redux-toolkit","03.javascript/04.react/06.redux/04.redux-toolkit",[2060,2064,2068,2072],{"title":2061,"path":2062,"stem":2063},"Налаштування Store з configureStore","/javascript/react/redux/redux-toolkit/configure-store","03.javascript/04.react/06.redux/04.redux-toolkit/01.configure-store",{"title":2065,"path":2066,"stem":2067},"createSlice: Революція в Redux","/javascript/react/redux/redux-toolkit/create-slice","03.javascript/04.react/06.redux/04.redux-toolkit/02.create-slice",{"title":2069,"path":2070,"stem":2071},"Асинхронність з createAsyncThunk","/javascript/react/redux/redux-toolkit/async-thunks","03.javascript/04.react/06.redux/04.redux-toolkit/03.async-thunks",{"title":2073,"path":2074,"stem":2075},"04. Entity Adapter: Керування нормалізованим станом","/javascript/react/redux/redux-toolkit/entity-adapter","03.javascript/04.react/06.redux/04.redux-toolkit/04.entity-adapter",{"title":2077,"icon":92,"path":2078,"stem":2079,"children":2080,"page":59},"Advanced","/javascript/react/redux/advanced","03.javascript/04.react/06.redux/05.advanced",[2081,2085,2089],{"title":2082,"path":2083,"stem":2084},"Мемоізація та Селектори: Повний Гайд по Reselect","/javascript/react/redux/advanced/selectors-reselect","03.javascript/04.react/06.redux/05.advanced/01.selectors-reselect",{"title":2086,"path":2087,"stem":2088},"RTK Query: Архітектура Серверного Кешу","/javascript/react/redux/advanced/rtk-query-intro","03.javascript/04.react/06.redux/05.advanced/02.rtk-query-intro",{"title":1936,"path":2090,"stem":2091},"/javascript/react/redux/advanced/architecture-best-practices","03.javascript/04.react/06.redux/05.advanced/03.architecture-best-practices",{"title":2093,"icon":132,"path":2094,"stem":2095,"children":2096,"page":59},"Project Kanban","/javascript/react/redux/project-kanban","03.javascript/04.react/06.redux/06.project-kanban",[2097,2101,2105,2109,2113,2117],{"title":2098,"path":2099,"stem":2100},"Проєкт: Kanban Board (Trello Clone)","/javascript/react/redux/project-kanban/project-overview","03.javascript/04.react/06.redux/06.project-kanban/01.project-overview",{"title":2102,"path":2103,"stem":2104},"Налаштування та Типізація","/javascript/react/redux/project-kanban/setup-and-types","03.javascript/04.react/06.redux/06.project-kanban/02.setup-and-types",{"title":2106,"path":2107,"stem":2108},"Board Slice: Серце Дошки","/javascript/react/redux/project-kanban/board-slice","03.javascript/04.react/06.redux/06.project-kanban/03.board-slice",{"title":2110,"path":2111,"stem":2112},"Логіка Drag & Drop","/javascript/react/redux/project-kanban/drag-and-drop-logic","03.javascript/04.react/06.redux/06.project-kanban/04.drag-and-drop-logic",{"title":2114,"path":2115,"stem":2116},"Інтеграція з RTK Query","/javascript/react/redux/project-kanban/rtk-query-integration","03.javascript/04.react/06.redux/06.project-kanban/05.rtk-query-integration",{"title":2118,"path":2119,"stem":2120},"Optimistic Updates","/javascript/react/redux/project-kanban/optimistic-updates","03.javascript/04.react/06.redux/06.project-kanban/06.optimistic-updates",{"title":2122,"icon":132,"path":2123,"stem":2124,"children":2125,"page":59},"Testing","/javascript/react/redux/testing","03.javascript/04.react/06.redux/07.testing",[2126,2130,2134,2138,2142],{"title":2127,"path":2128,"stem":2129},"Тестування Redux","/javascript/react/redux/testing/intro-testing","03.javascript/04.react/06.redux/07.testing/01.intro-testing",{"title":2131,"path":2132,"stem":2133},"Тестування Reducers","/javascript/react/redux/testing/testing-reducers","03.javascript/04.react/06.redux/07.testing/02.testing-reducers",{"title":2135,"path":2136,"stem":2137},"Тестування Селекторів","/javascript/react/redux/testing/testing-selectors","03.javascript/04.react/06.redux/07.testing/03.testing-selectors",{"title":2139,"path":2140,"stem":2141},"Тестування Компонентів (Integration)","/javascript/react/redux/testing/testing-components","03.javascript/04.react/06.redux/07.testing/04.testing-components",{"title":2143,"path":2144,"stem":2145},"Тестування Async Thunks","/javascript/react/redux/testing/testing-thunks","03.javascript/04.react/06.redux/07.testing/05.testing-thunks",{"title":2147,"icon":132,"path":2148,"stem":2149,"children":2150},"Ui Libraries","/javascript/react/ui-libraries","03.javascript/04.react/07.ui-libraries/index",[2151,2153,2157,2161,2165,2169,2173],{"title":2152,"path":2148,"stem":2149},"UI Бібліотеки в React",{"title":2154,"path":2155,"stem":2156},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","/javascript/react/ui-libraries/introduction-to-ui-libraries","03.javascript/04.react/07.ui-libraries/01.introduction-to-ui-libraries",{"title":2158,"path":2159,"stem":2160},"Філософія shadcn/ui: \"Not a Component Library\"","/javascript/react/ui-libraries/shadcn-philosophy","03.javascript/04.react/07.ui-libraries/02.shadcn-philosophy",{"title":2162,"path":2163,"stem":2164},"Установка та Налаштування shadcn/ui","/javascript/react/ui-libraries/shadcn-installation","03.javascript/04.react/07.ui-libraries/03.shadcn-installation",{"title":2166,"path":2167,"stem":2168},"Базові Компоненти shadcn/ui: Фундамент Інтерфейсу","/javascript/react/ui-libraries/shadcn-components-basics","03.javascript/04.react/07.ui-libraries/04.shadcn-components-basics",{"title":2170,"path":2171,"stem":2172},"Компоненти Форм: Побудова Інтерактивних Form","/javascript/react/ui-libraries/shadcn-components-forms","03.javascript/04.react/07.ui-libraries/05.shadcn-components-forms",{"title":2174,"path":2175,"stem":2176},"Складні Компоненти: Dialog, Dropdown, Table та Command","/javascript/react/ui-libraries/shadcn-components-advanced","03.javascript/04.react/07.ui-libraries/06.shadcn-components-advanced",{"title":2178,"icon":2179,"path":2180,"stem":2181,"children":2182,"page":59},"TypeScript","i-devicon-typescript","/javascript/typescript","03.javascript/05.typescript",[2183,2187,2191,2195,2199,2203,2207,2211],{"title":2184,"path":2185,"stem":2186},"TypeScript: Броня для вашого коду","/javascript/typescript/intro-and-basic-types","03.javascript/05.typescript/01.intro-and-basic-types",{"title":2188,"path":2189,"stem":2190},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","/javascript/typescript/interfaces-and-advanced-types","03.javascript/05.typescript/02.interfaces-and-advanced-types",{"title":2192,"path":2193,"stem":2194},"Алхімія Типів: Generics та Utility Types","/javascript/typescript/generics-and-utilities","03.javascript/05.typescript/03.generics-and-utilities",{"title":2196,"path":2197,"stem":2198},"Архітектура та Шаблони: Класи в TypeScript","/javascript/typescript/classes-and-oop","03.javascript/05.typescript/04.classes-and-oop",{"title":2200,"path":2201,"stem":2202},"Продакшн та Екосистема: Advanced Config & Workflow","/javascript/typescript/advanced-patterns-and-config","03.javascript/05.typescript/05.advanced-patterns-and-config",{"title":2204,"path":2205,"stem":2206},"TypeScript у світі React","/javascript/typescript/react-basics","03.javascript/05.typescript/06.react-basics",{"title":2208,"path":2209,"stem":2210},"React + TypeScript: Продвинуті патерни","/javascript/typescript/react-advanced","03.javascript/05.typescript/07.react-advanced",{"title":2212,"path":2213,"stem":2214},"React + TypeScript: Екосистема та бібліотеки","/javascript/typescript/react-ecosystem","03.javascript/05.typescript/08.react-ecosystem",{"title":2216,"path":2217,"stem":2218},"Atomic Design","/javascript/atomic-design","03.javascript/2.atomic-design",{"title":2220,"icon":2221,"path":2222,"stem":2223,"children":2224,"page":59},"Java","i-devicon-java","/java","04.java",[2225,2228,2231,2235,2239,2243,2247],{"title":162,"path":2226,"stem":2227},"/java/data-mapper-part1","04.java/01.data-mapper-part1",{"title":166,"path":2229,"stem":2230},"/java/data-mapper-part2","04.java/02.data-mapper-part2",{"title":2232,"path":2233,"stem":2234},"Service Layer: Організація бізнес-логіки","/java/service-layer","04.java/03.service-layer",{"title":2236,"path":2237,"stem":2238},"Rich Domain Model та State Pattern","/java/rich-domain-model","04.java/04.rich-domain-model",{"title":2240,"path":2241,"stem":2242},"Патерни для складної бізнес-логіки","/java/business-logic-patterns","04.java/05.business-logic-patterns",{"title":2244,"path":2245,"stem":2246},"Обробка помилок та валідація","/java/error-handling-validation","04.java/06.error-handling-validation",{"title":2248,"path":2249,"stem":2250,"children":2251,"page":59},"Проектування баз даних","/java/pr2","04.java/pr2",[2252,2256,2260,2264,2268,2272,2276,2280,2284,2288,2292,2296,2300,2304,2308,2312,2316,2320,2324,2328,2332,2336,2340,2344,2348],{"title":2253,"path":2254,"stem":2255},"Концептуальне моделювання: Мистецтво розуміння предметної області","/java/pr2/conceptual-modeling","04.java/pr2/01.conceptual-modeling",{"title":2257,"path":2258,"stem":2259},"Логічне моделювання: Від бізнес-ідей до структур даних","/java/pr2/logical-modeling","04.java/pr2/02.logical-modeling",{"title":2261,"path":2262,"stem":2263},"Нормалізація: Гігієна даних та боротьба з аномаліями","/java/pr2/normalization","04.java/pr2/03.normalization",{"title":2265,"path":2266,"stem":2267},"Фізична схема: Від абстракції до DDL","/java/pr2/physical-schema","04.java/pr2/04.physical-schema",{"title":2269,"path":2270,"stem":2271},"Архітектурна класифікація таблиць","/java/pr2/table-classification","04.java/pr2/05.table-classification",{"title":2273,"path":2274,"stem":2275},"Database Migrations: Версіонування схеми з Flyway","/java/pr2/database-migrations","04.java/pr2/06.database-migrations",{"title":2277,"path":2278,"stem":2279},"А що, якби це була не реляційна БД?","/java/pr2/beyond-relational","04.java/pr2/07.beyond-relational",{"title":2281,"path":2282,"stem":2283},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","/java/pr2/impedance-mismatch","04.java/pr2/09.impedance-mismatch",{"title":2285,"path":2286,"stem":2287},"JDBC: Перший контакт із базою даних","/java/pr2/jdbc-fundamentals","04.java/pr2/10.jdbc-fundamentals",{"title":2289,"path":2290,"stem":2291},"Якість коду: Spotless, SpotBugs та SonarQube","/java/pr2/10a.code-quality","04.java/pr2/10a.code-quality",{"title":2293,"path":2294,"stem":2295},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","/java/pr2/connection-pool","04.java/pr2/11.connection-pool",{"title":2297,"path":2298,"stem":2299},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","/java/pr2/row-data-gateway","04.java/pr2/12.row-data-gateway",{"title":2301,"path":2302,"stem":2303},"Table Data Gateway: Фасад таблиці як архітектурний відступ","/java/pr2/table-data-gateway","04.java/pr2/13.table-data-gateway",{"title":2305,"path":2306,"stem":2307},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","/java/pr2/repository-data-mapper","04.java/pr2/14.repository-data-mapper",{"title":2309,"path":2310,"stem":2311},"Identity Map: Кешування сутностей у рамках сесії","/java/pr2/identity-map","04.java/pr2/15.identity-map",{"title":2313,"path":2314,"stem":2315},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","/java/pr2/unit-of-work","04.java/pr2/16.unit-of-work",{"title":2317,"path":2318,"stem":2319},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","/java/pr2/strategy-sql","04.java/pr2/17.strategy-sql",{"title":2321,"path":2322,"stem":2323},"Proxy: Lazy Loading для One-To-Many колекцій","/java/pr2/proxy-lazy-loading","04.java/pr2/18.proxy-lazy-loading",{"title":2325,"path":2326,"stem":2327},"Generic Repository через Java Reflection: анотації та динамічний SQL","/java/pr2/generic-repository-reflection","04.java/pr2/19.generic-repository-reflection",{"title":2329,"path":2330,"stem":2331},"Specification Pattern: Композиція бізнес-правил для складних запитів","/java/pr2/specification-pattern","04.java/pr2/20.specification-pattern",{"title":2333,"path":2334,"stem":2335},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","/java/pr2/20a.advanced-specifications","04.java/pr2/20a.advanced-specifications",{"title":2337,"path":2338,"stem":2339},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","/java/pr2/asynchronous-jdbc","04.java/pr2/21.asynchronous-jdbc",{"title":2341,"path":2342,"stem":2343},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","/java/pr2/integration-testing-h2","04.java/pr2/22.integration-testing-h2",{"title":2345,"path":2346,"stem":2347},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","/java/pr2/integration-testing-testcontainers","04.java/pr2/23.integration-testing-testcontainers",{"title":2349,"path":2350,"stem":2351},"Модуль \"Проектування реляційних баз даних\" для 04.java/pr2","/java/pr2/implementation_plan","04.java/pr2/implementation_plan",{"title":2353,"icon":2354,"path":2355,"stem":2356,"children":2357,"page":59},"Бази даних","i-lucide-database","/databases","06.databases",[2358,2388,2411,2448,2477,2495,2529,2541,2550],{"title":2359,"icon":2360,"path":2361,"stem":2362,"children":2363,"page":59},"Intro","i-lucide-play","/databases/intro","06.databases/01.intro",[2364,2368,2372,2376,2380,2384],{"title":2365,"path":2366,"stem":2367},"Введення в теорію баз даних","/databases/intro/introduction-to-databases","06.databases/01.intro/01.introduction-to-databases",{"title":2369,"path":2370,"stem":2371},"Реляційна модель даних","/databases/intro/relational-model-theory","06.databases/01.intro/02.relational-model-theory",{"title":2373,"path":2374,"stem":2375},"ER-моделювання","/databases/intro/er-modeling","06.databases/01.intro/03.er-modeling",{"title":2377,"path":2378,"stem":2379},"Логічне проектування БД","/databases/intro/logical-schema","06.databases/01.intro/04.logical-schema",{"title":2381,"path":2382,"stem":2383},"Класифікація таблиць","/databases/intro/table-classification","06.databases/01.intro/05.table-classification",{"title":2385,"path":2386,"stem":2387},"PlantUML для баз даних","/databases/intro/plantuml-diagrams","06.databases/01.intro/06.plantuml-diagrams",{"title":2389,"icon":2354,"path":2390,"stem":2391,"children":2392,"page":59},"MS SQL Server Start","/databases/ms-sql-server-start","06.databases/02.ms-sql-server-start",[2393,2397,2403,2407],{"title":2394,"path":2395,"stem":2396},"Типи даних у MS SQL Server","/databases/ms-sql-server-start/data-types","06.databases/02.ms-sql-server-start/01.data-types",{"title":2398,"path":2399,"stem":2400,"children":2401},"Індекси у MS SQL Server","/databases/ms-sql-server-start/sql-indexes","06.databases/02.ms-sql-server-start/02.sql-indexes",[2402],{"title":2398,"path":2399,"stem":2400},{"title":2404,"path":2405,"stem":2406},"Системні бази даних MS SQL Server","/databases/ms-sql-server-start/system-databases","06.databases/02.ms-sql-server-start/03.system-databases",{"title":2408,"path":2409,"stem":2410},"Огляд мови SQL та запитів","/databases/ms-sql-server-start/sql-queries-overview","06.databases/02.ms-sql-server-start/04.sql-queries-overview",{"title":2412,"icon":2354,"path":2413,"stem":2414,"children":2415,"page":59},"SQL","/databases/sql","06.databases/03.sql",[2416,2420,2424,2428,2432,2436,2440,2444],{"title":2417,"path":2418,"stem":2419},"Налаштування демонстраційної бази даних","/databases/sql/sample-database-setup","06.databases/03.sql/00.sample-database-setup",{"title":2421,"path":2422,"stem":2423},"DDL - Створення таблиць (CREATE TABLE)","/databases/sql/ddl-create-table","06.databases/03.sql/01.ddl-create-table",{"title":2425,"path":2426,"stem":2427},"DDL - Зміна та видалення таблиць (ALTER, DROP)","/databases/sql/ddl-alter-drop-table","06.databases/03.sql/02.ddl-alter-drop-table",{"title":2429,"path":2430,"stem":2431},"SELECT запити - Основи","/databases/sql/select-queries-fundamentals","06.databases/03.sql/03.select-queries-fundamentals",{"title":2433,"path":2434,"stem":2435},"SELECT запити - Розширені можливості","/databases/sql/select-queries-advanced","06.databases/03.sql/04.select-queries-advanced",{"title":2437,"path":2438,"stem":2439},"INSERT запити - Додавання даних","/databases/sql/insert-queries","06.databases/03.sql/05.insert-queries",{"title":2441,"path":2442,"stem":2443},"UPDATE та DELETE запити","/databases/sql/update-delete-queries","06.databases/03.sql/06.update-delete-queries",{"title":2445,"path":2446,"stem":2447},"Транзакції в SQL","/databases/sql/transactions","06.databases/03.sql/07.transactions",{"title":2449,"icon":2354,"path":2450,"stem":2451,"children":2452,"page":59},"Multi Table Databases","/databases/multi-table-databases","06.databases/04.multi-table-databases",[2453,2457,2461,2465,2469,2473],{"title":2454,"path":2455,"stem":2456},"Зв'язки та нормалізація БД","/databases/multi-table-databases/relationships-and-normalization","06.databases/04.multi-table-databases/00.relationships-and-normalization",{"title":2458,"path":2459,"stem":2460},"INNER JOIN - З'єднання таблиць","/databases/multi-table-databases/inner-join","06.databases/04.multi-table-databases/01.inner-join",{"title":2462,"path":2463,"stem":2464},"OUTER JOINs - LEFT, RIGHT, FULL","/databases/multi-table-databases/outer-joins","06.databases/04.multi-table-databases/02.outer-joins",{"title":2466,"path":2467,"stem":2468},"CROSS та SELF JOINs","/databases/multi-table-databases/cross-self-joins","06.databases/04.multi-table-databases/03.cross-self-joins",{"title":2470,"path":2471,"stem":2472},"Підзапити (Subqueries)","/databases/multi-table-databases/subqueries","06.databases/04.multi-table-databases/04.subqueries",{"title":2474,"path":2475,"stem":2476},"Агрегації з JOIN","/databases/multi-table-databases/aggregations-with-joins","06.databases/04.multi-table-databases/05.aggregations-with-joins",{"title":2478,"icon":2479,"path":2480,"stem":2481,"children":2482,"page":59},"Aggregate Functions","i-lucide-calculator","/databases/aggregate-functions","06.databases/05.aggregate-functions",[2483,2487,2491],{"title":2484,"path":2485,"stem":2486},"Функції агрегування в MS SQL Server","/databases/aggregate-functions/introduction-aggregate-functions","06.databases/05.aggregate-functions/01.introduction-aggregate-functions",{"title":2488,"path":2489,"stem":2490},"Групування даних в MS SQL Server","/databases/aggregate-functions/grouping-data","06.databases/05.aggregate-functions/02.grouping-data",{"title":2492,"path":2493,"stem":2494},"Підзапити з агрегатними функціями","/databases/aggregate-functions/subqueries-aggregates","06.databases/05.aggregate-functions/03.subqueries-aggregates",{"title":2496,"icon":2497,"path":2498,"stem":2499,"children":2500,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","/databases/triggers-stored-procedures","06.databases/07.triggers-stored-procedures",[2501,2505,2509,2513,2517,2521,2525],{"title":2502,"path":2503,"stem":2504},"DML-тригери","/databases/triggers-stored-procedures/dml-triggers","06.databases/07.triggers-stored-procedures/01.dml-triggers",{"title":2506,"path":2507,"stem":2508},"DDL-тригери","/databases/triggers-stored-procedures/ddl-triggers","06.databases/07.triggers-stored-procedures/02.ddl-triggers",{"title":2510,"path":2511,"stem":2512},"Transact-SQL розширення","/databases/triggers-stored-procedures/transact-sql-extensions","06.databases/07.triggers-stored-procedures/03.transact-sql-extensions",{"title":2514,"path":2515,"stem":2516},"Транзакції","/databases/triggers-stored-procedures/transactions","06.databases/07.triggers-stored-procedures/04.transactions",{"title":2518,"path":2519,"stem":2520},"Зберігаємі процедури","/databases/triggers-stored-procedures/stored-procedures","06.databases/07.triggers-stored-procedures/05.stored-procedures",{"title":2522,"path":2523,"stem":2524},"Користувацькі функції","/databases/triggers-stored-procedures/user-defined-functions","06.databases/07.triggers-stored-procedures/06.user-defined-functions",{"title":2526,"path":2527,"stem":2528},"Безпека баз даних","/databases/triggers-stored-procedures/security","06.databases/07.triggers-stored-procedures/08.security",{"title":2526,"icon":793,"path":2530,"stem":2531,"children":2532,"page":59},"/databases/security","06.databases/08.security",[2533,2537],{"title":2534,"path":2535,"stem":2536},"Вступ до безпеки баз даних","/databases/security/introduction","06.databases/08.security/01.introduction",{"title":2538,"path":2539,"stem":2540},"Системні представлення та метадані","/databases/security/system-views","06.databases/08.security/02.system-views",{"title":2542,"icon":2543,"path":2544,"stem":2545,"children":2546,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","/databases/backup-recovery","06.databases/09.backup-recovery",[2547],{"title":2542,"path":2548,"stem":2549},"/databases/backup-recovery/backup-restore","06.databases/09.backup-recovery/01.backup-restore",{"title":2551,"icon":2552,"path":2553,"stem":2554,"children":2555,"page":59},"Повнотекстовий пошук","i-lucide-search","/databases/full-text-search","06.databases/10.full-text-search",[2556],{"title":2551,"path":2557,"stem":2558},"/databases/full-text-search/full-text-search","06.databases/10.full-text-search/01.full-text-search",{"title":2560,"icon":2561,"path":2562,"stem":2563,"children":2564,"page":59},"Tools","i-lucide-wrench","/tools","07.tools",[2565],{"title":2566,"icon":2567,"path":2568,"stem":2569,"children":2570},"Docker","i-simple-icons-docker","/tools/docker","07.tools/01.docker/index",[2571,2573,2577,2581,2585,2589,2593,2597,2601,2605,2609,2613,2617,2621,2625,2629,2633,2637],{"title":2572,"path":2568,"stem":2569},"Docker: від нуля до production",{"title":2574,"path":2575,"stem":2576},"Контейнеризація — від проблеми до рішення","/tools/docker/containerization-concept","07.tools/01.docker/01.containerization-concept",{"title":2578,"path":2579,"stem":2580},"Docker — що це і навіщо?","/tools/docker/docker-what-and-why","07.tools/01.docker/02.docker-what-and-why",{"title":2582,"path":2583,"stem":2584},"Архітектура Docker Engine","/tools/docker/docker-architecture","07.tools/01.docker/03.docker-architecture",{"title":2586,"path":2587,"stem":2588},"Встановлення Docker","/tools/docker/installation","07.tools/01.docker/04.installation",{"title":2590,"path":2591,"stem":2592},"Перший контейнер — docker run","/tools/docker/first-container","07.tools/01.docker/05.first-container",{"title":2594,"path":2595,"stem":2596},"Життєвий цикл контейнера","/tools/docker/container-lifecycle","07.tools/01.docker/06.container-lifecycle",{"title":2598,"path":2599,"stem":2600},"Docker Images — фундаментальні концепції","/tools/docker/docker-images-fundamentals","07.tools/01.docker/07.docker-images-fundamentals",{"title":2602,"path":2603,"stem":2604},"Dockerfile — основи","/tools/docker/dockerfile-basics","07.tools/01.docker/08.dockerfile-basics",{"title":2606,"path":2607,"stem":2608},"Dockerfile — просунуті техніки","/tools/docker/dockerfile-advanced","07.tools/01.docker/09.dockerfile-advanced",{"title":2610,"path":2611,"stem":2612},"Build Context та кешування шарів","/tools/docker/build-context-and-cache","07.tools/01.docker/10.build-context-and-cache",{"title":2614,"path":2615,"stem":2616},"Реєстри Docker-образів","/tools/docker/image-registries","07.tools/01.docker/11.image-registries",{"title":2618,"path":2619,"stem":2620},"Контейнеризація .NET додатків","/tools/docker/dotnet-containerization","07.tools/01.docker/12.dotnet-containerization",{"title":2622,"path":2623,"stem":2624},"Томи та збереження даних","/tools/docker/volumes-and-data","07.tools/01.docker/13.volumes-and-data",{"title":2626,"path":2627,"stem":2628},"Основи мережі в Docker","/tools/docker/networking-basics","07.tools/01.docker/14.networking-basics",{"title":2630,"path":2631,"stem":2632},"Змінні оточення та конфігурація","/tools/docker/environment-and-configuration","07.tools/01.docker/15.environment-and-configuration",{"title":2634,"path":2635,"stem":2636},"Docker Compose — оркестрація контейнерів","/tools/docker/docker-compose-basics","07.tools/01.docker/16.docker-compose-basics",{"title":2638,"path":2639,"stem":2640},"Docker Compose — Multi-Service застосунки","/tools/docker/compose-multi-service","07.tools/01.docker/17.compose-multi-service",{"title":2642,"icon":2643,"path":2644,"stem":2645,"children":2646,"page":59},"Software Engineering","i-lucide-code-2","/software-engineering","09.software-engineering",[2647,2651,2655,2659,2663,2667,2671,2675,2679,2683,2687],{"title":2648,"path":2649,"stem":2650},"1. Аналіз предметної області. Експертні знання та складність","/software-engineering/intro.subdomains","09.software-engineering/01.intro.subdomains",{"title":2652,"path":2653,"stem":2654},"2. Обмежені контексти. Інтеграція обмежених контекстів","/software-engineering/integrating-limited-contexts","09.software-engineering/02.integrating-limited-contexts",{"title":2656,"path":2657,"stem":2658},"3. Реалізація простої бізнес-логіки","/software-engineering/simple","09.software-engineering/03.simple",{"title":2660,"path":2661,"stem":2662},"4. Опрацювання складної бізнес-логіки","/software-engineering/complex-business-logic","09.software-engineering/04.complex-business-logic",{"title":2664,"path":2665,"stem":2666},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","/software-engineering/modelling-the-time-factor","09.software-engineering/05.modelling-the-time-factor",{"title":2668,"path":2669,"stem":2670},"6. Архітектурні патерни","/software-engineering/architectural-patterns","09.software-engineering/06.architectural-patterns",{"title":2672,"path":2673,"stem":2674},"Паттерни взаємодії","/software-engineering/patterns-of-interaction","09.software-engineering/07.patterns-of-interaction",{"title":2676,"path":2677,"stem":2678},"Евристика проєктування","/software-engineering/design-heuristics","09.software-engineering/08.design-heuristics",{"title":2680,"path":2681,"stem":2682},"Еволюція проєктних рішень","/software-engineering/evolution-of-design-solutions","09.software-engineering/09.evolution-of-design-solutions",{"title":2684,"path":2685,"stem":2686},"EventStorming","/software-engineering/eventstorming","09.software-engineering/10.eventstorming",{"title":2688,"path":2689,"stem":2690},"DDD на практиці","/software-engineering/ddd-in-practice","09.software-engineering/11.ddd-in-practice",{"title":2692,"icon":943,"path":2693,"stem":2694,"children":2695,"page":59},"DDD","/ddd","10.ddd",[2696,2700,2704,2708,2712,2716,2720,2724,2728,2732,2736,2740,2744],{"title":2697,"path":2698,"stem":2699},"Аналіз предметної області","/ddd/domain-analysis","10.ddd/01.domain-analysis",{"title":2701,"path":2702,"stem":2703},"Експертні знання про предметну область","/ddd/domain-expert-knowledge","10.ddd/02.domain-expert-knowledge",{"title":2705,"path":2706,"stem":2707},"Як осмислити складність предметної області","/ddd/managing-domain-complexity","10.ddd/03.managing-domain-complexity",{"title":2709,"path":2710,"stem":2711},"Інтеграція обмежених контекстів","/ddd/bounded-context-integration","10.ddd/04.bounded-context-integration",{"title":2713,"path":2714,"stem":2715},"Реалізація простої бізнес-логіки","/ddd/simple-business-logic","10.ddd/05.simple-business-logic",{"title":2717,"path":2718,"stem":2719},"Обробка складної бізнес-логіки","/ddd/complex-business-logic","10.ddd/06.complex-business-logic",{"title":2721,"path":2722,"stem":2723},"Моделювання фактора часу","/ddd/time-modeling","10.ddd/07.time-modeling",{"title":2725,"path":2726,"stem":2727},"Глава 8. Архітектурні Патерни","/ddd/architectural-patterns","10.ddd/08.architectural-patterns",{"title":2729,"path":2730,"stem":2731},"Глава 9. Патерни Взаємодії","/ddd/interaction-patterns","10.ddd/09.interaction-patterns",{"title":2733,"path":2734,"stem":2735},"Глава 10. Проектні Евристики","/ddd/design-heuristics","10.ddd/10.design-heuristics",{"title":2737,"path":2738,"stem":2739},"Глава 11. Еволюція Проектних Рішень","/ddd/evolution-of-design-decisions","10.ddd/11.evolution-of-design-decisions",{"title":2741,"path":2742,"stem":2743},"Глава 12. EventStorming","/ddd/event-storming","10.ddd/12.event-storming",{"title":2745,"path":2746,"stem":2747},"Глава 13. DDD на Практиці","/ddd/ddd-in-practice","10.ddd/13.ddd-in-practice",{"title":2749,"icon":2750,"path":2751,"stem":2752,"children":2753,"page":59},"Media Streaming","i-lucide-video","/media-streaming","11.media-streaming",[2754,2758,2762,2766,2770,2774,2778],{"title":2755,"path":2756,"stem":2757},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","/media-streaming/introduction","11.media-streaming/01.introduction",{"title":2759,"path":2760,"stem":2761},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","/media-streaming/audio-video-anatomy","11.media-streaming/02.audio-video-anatomy",{"title":2763,"path":2764,"stem":2765},"03. The Gym: FFmpeg Deep Dive","/media-streaming/ffmpeg-gym","11.media-streaming/03.ffmpeg-gym",{"title":2767,"path":2768,"stem":2769},"04. HLS Protocol: HTTP Live Streaming у Деталях","/media-streaming/hls-protocol","11.media-streaming/04.hls-protocol",{"title":2771,"path":2772,"stem":2773},"05. DASH Protocol: Відкритий Стандарт","/media-streaming/dash-protocol","11.media-streaming/05.dash-protocol",{"title":2775,"path":2776,"stem":2777},"06. Масштабування: CDN та Adaptive Bitrate","/media-streaming/cdn-and-adaptive-bitrate","11.media-streaming/06.cdn-and-adaptive-bitrate",{"title":2779,"path":2780,"stem":2781},"07. Війна із Затримкою (Latency)","/media-streaming/realtime-latency","11.media-streaming/07.realtime-latency",{"title":2783,"icon":2784,"path":2785,"stem":2786,"children":2787,"page":59},"HTML & CSS","i-devicon-html5","/html-css","12.html-css",[2788,2792,2796,2800,2804,2808,2812,2816,2820,2824,2828,2832,2836,2840,2844,2848,2852,2856,2860,2864,2868,2872,2876,2880,2884,2888,2892,2896,2900,2904],{"title":2789,"path":2790,"stem":2791},"Вступ до HTML. Структура документа","/html-css/intro-html-structure","12.html-css/01.intro-html-structure",{"title":2793,"path":2794,"stem":2795},"Форматування тексту в HTML","/html-css/html-text-formatting","12.html-css/02.html-text-formatting",{"title":2797,"path":2798,"stem":2799},"Посилання та зображення в HTML","/html-css/html-links-images","12.html-css/03.html-links-images",{"title":2801,"path":2802,"stem":2803},"Списки та таблиці в HTML","/html-css/html-lists-tables","12.html-css/04.html-lists-tables",{"title":2805,"path":2806,"stem":2807},"Форми в HTML","/html-css/html-forms","12.html-css/05.html-forms",{"title":2809,"path":2810,"stem":2811},"Семантичні елементи HTML5","/html-css/html-semantic-elements","12.html-css/06.html-semantic-elements",{"title":2813,"path":2814,"stem":2815},"Мультимедіа та розширені елементи HTML","/html-css/html-multimedia-advanced","12.html-css/07.html-multimedia-advanced",{"title":2817,"path":2818,"stem":2819},"Мікророзмітка та SEO в HTML","/html-css/html-microdata-seo","12.html-css/08.html-microdata-seo",{"title":2821,"path":2822,"stem":2823},"Вступ до CSS. Селектори та специфічність","/html-css/css-intro-selectors","12.html-css/09.css-intro-selectors",{"title":2825,"path":2826,"stem":2827},"Блокова модель CSS. Відступи. Box Sizing","/html-css/css-box-model","12.html-css/10.css-box-model",{"title":2829,"path":2830,"stem":2831},"Розміри у CSS: повний довідник одиниць і ключових слів","/html-css/10a.css-sizing","12.html-css/10a.css-sizing",{"title":2833,"path":2834,"stem":2835},"Типографіка в CSS. Шрифти та текст","/html-css/css-typography","12.html-css/11.css-typography",{"title":2837,"path":2838,"stem":2839},"Кольори та фони в CSS","/html-css/css-colors-backgrounds","12.html-css/12.css-colors-backgrounds",{"title":2841,"path":2842,"stem":2843},"Тіні та фільтри в CSS","/html-css/12b.css-shadows-filters","12.html-css/12b.css-shadows-filters",{"title":2845,"path":2846,"stem":2847},"CSS Flexbox: Фундамент гнучких макетів","/html-css/css-flexbox-fundamentals","12.html-css/13.css-flexbox-fundamentals",{"title":2849,"path":2850,"stem":2851},"CSS Flexbox: Вирівнювання та Позиціонування","/html-css/css-flexbox-alignment-sizing-and-patterns","12.html-css/14.css-flexbox-alignment-sizing-and-patterns",{"title":2853,"path":2854,"stem":2855},"CSS Grid. Двовимірний макет. Частина 1","/html-css/css-layout-grid","12.html-css/15.css-layout-grid",{"title":2857,"path":2858,"stem":2859},"CSS Grid. Двовимірний макет. Частина 2","/html-css/css-layout-grid-advanced","12.html-css/16.css-layout-grid-advanced",{"title":2861,"path":2862,"stem":2863},"Позиціонування в CSS. Z-index. Stacking Context","/html-css/css-positioning","12.html-css/17.css-positioning",{"title":2865,"path":2866,"stem":2867},"CSS Анімації та Переходи","/html-css/css-animations-transitions","12.html-css/18.css-animations-transitions",{"title":2869,"path":2870,"stem":2871},"Адаптивний дизайн. Media Queries. Частина 1","/html-css/css-responsive-media-queries","12.html-css/19.css-responsive-media-queries",{"title":2873,"path":2874,"stem":2875},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","/html-css/css-responsive-advanced","12.html-css/20.css-responsive-advanced",{"title":2877,"path":2878,"stem":2879},"CSS Custom Properties. Методології. Сучасний CSS","/html-css/css-variables-methodologies","12.html-css/21.css-variables-methodologies",{"title":2881,"path":2882,"stem":2883},"Сучасний CSS 2023–2025: Нові можливості","/html-css/css-modern-features","12.html-css/22.css-modern-features",{"title":2885,"path":2886,"stem":2887},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","/html-css/22a.css-nesting-modern-syntax","12.html-css/22a.css-nesting-modern-syntax",{"title":2889,"path":2890,"stem":2891},"CSS для форм та інтерактивних станів","/html-css/css-forms-interactive-states","12.html-css/23.css-forms-interactive-states",{"title":2893,"path":2894,"stem":2895},"Доступність у CSS (CSS Accessibility)","/html-css/css-accessibility","12.html-css/24.css-accessibility",{"title":2897,"path":2898,"stem":2899},"CSS-функції та сучасні sizing primitives","/html-css/css-functions-sizing","12.html-css/25.css-functions-sizing",{"title":2901,"path":2902,"stem":2903},"Rendering Pipeline і CSS Performance","/html-css/css-rendering-performance","12.html-css/26.css-rendering-performance",{"title":2905,"path":2906,"stem":2907},"CSS Best Practices: типові ситуації та правильні рішення","/html-css/css-best-practices","12.html-css/27.css-best-practices",{"title":2909,"path":2910,"stem":2911,"children":2912,"page":59},"Tailwind","/tailwind","21.tailwind",[2913,2917,2921,2925,2929,2933,2937,2941],{"title":2914,"path":2915,"stem":2916},"Що таке Tailwind CSS і навіщо він потрібен","/tailwind/tailwind-intro-philosophy","21.tailwind/01.tailwind-intro-philosophy",{"title":2918,"path":2919,"stem":2920},"Встановлення та налаштування Tailwind CSS v4","/tailwind/tailwind-installation-setup","21.tailwind/02.tailwind-installation-setup",{"title":2922,"path":2923,"stem":2924},"Utility-класи: основи та система Tailwind","/tailwind/tailwind-utility-classes-core","21.tailwind/03.tailwind-utility-classes-core",{"title":2926,"path":2927,"stem":2928},"Layout: Flexbox та Grid через Tailwind","/tailwind/tailwind-flexbox-grid","21.tailwind/04.tailwind-flexbox-grid",{"title":2930,"path":2931,"stem":2932},"Кастомізація теми через @theme у Tailwind v4","/tailwind/tailwind-theme-customization","21.tailwind/05.tailwind-theme-customization",{"title":2934,"path":2935,"stem":2936},"Варіанти: hover, focus, responsive, dark mode та нові v4","/tailwind/tailwind-variants-states","21.tailwind/06.tailwind-variants-states",{"title":2938,"path":2939,"stem":2940},"Типографіка та система кольорів у Tailwind v4","/tailwind/tailwind-typography-colors","21.tailwind/07.tailwind-typography-colors",{"title":2942,"path":2943,"stem":2944},"Компоненти та повторюваність: @apply, @utility та патерни","/tailwind/tailwind-components-patterns","21.tailwind/08.tailwind-components-patterns",{"title":2946,"path":2947,"stem":2948},"Showcase Компонентів kostyl.dev","/test-new-components","98.test-new-components",{"id":2950,"title":1441,"body":2951,"description":6781,"extension":6782,"links":6783,"meta":6784,"navigation":3807,"path":1442,"seo":6785,"stem":1443,"__hash__":6786},"docs/01.csharp/12.desktop-ui/14.dependency-properties-part1.md",{"type":2952,"value":2953,"toc":6740},"minimark",[2954,2959,2964,2973,3017,3024,3031,3038,3041,3045,3048,3053,3056,3182,3185,3225,3229,3232,3335,3338,3369,3381,3383,3387,3394,3440,3444,3447,3490,3493,3751,3762,3766,3773,3906,3908,3912,3919,3923,3929,4114,4118,4237,4239,4243,4246,4250,4425,4430,4453,4529,4535,4539,4542,4616,4629,4633,4638,4745,4750,4831,4932,4944,4946,4950,4953,4957,4967,5287,5296,5300,5325,5327,5331,5340,5344,5350,5599,5603,5691,5700,5702,5706,5709,5713,5719,6076,6082,6084,6088,6093,6482,6484,6488,6493,6498,6515,6524,6654,6656,6660,6665,6696,6712,6714,6718,6736],[2955,2956,2958],"h1",{"id":2957},"dependency-properties-концепція-та-value-resolution","Dependency Properties: Концепція та Value Resolution",[2960,2961,2963],"h2",{"id":2962},"вступ","Вступ",[2965,2966,2967,2968,2972],"p",{},"Уявіть собі кнопку у вашому WPF-застосунку. Її колір фону (",[2969,2970,2971],"code",{},"Background",") може бути заданий у кількох місцях одночасно:",[2974,2975,2976,2985,2991,3001,3008],"ul",{},[2977,2978,2979,2980,2984],"li",{},"У ",[2981,2982,2983],"strong",{},"стилі"," додатку (синій колір для всіх кнопок)",[2977,2986,2979,2987,2990],{},[2981,2988,2989],{},"темі"," операційної системи (сірий за замовчуванням)",[2977,2992,2993,2996,2997,3000],{},[2981,2994,2995],{},"Локально"," у XAML (",[2969,2998,2999],{},"Background=\"Red\"",")",[2977,3002,3003,3004,3007],{},"Через ",[2981,3005,3006],{},"анімацію"," (плавна зміна кольору при наведенні)",[2977,3009,3003,3010,3013,3014,3000],{},[2981,3011,3012],{},"прив'язку даних"," (",[2969,3015,3016],{},"{Binding UserPreferredColor}",[2965,3018,3019,3020,3023],{},"Яке значення \"виграє\"? Як WPF вирішує цей конфлікт? Чому ",[2969,3021,3022],{},"Button.Background"," — це не просто звичайна C#-властивість з getter/setter?",[2965,3025,3026,3027,3030],{},"Відповідь криється у ",[2981,3028,3029],{},"Dependency Property System"," — одній з найважливіших архітектурних особливостей WPF. Це система, що робить можливими прив'язку даних, стилізацію, анімації та успадкування значень по дереву елементів.",[3032,3033,3034,3037],"note",{},[2981,3035,3036],{},"Для кого ця стаття?"," Якщо ви вже знайомі з базовими контролами WPF, XAML-синтаксисом та створювали прості інтерфейси — ця стаття відкриє вам \"внутрішню кухню\" платформи. Розуміння DependencyProperty критично важливе для просунутої роботи з WPF.",[3039,3040],"hr",{},[2960,3042,3044],{"id":3043},"проблема-чому-clr-властивості-недостатньо","Проблема: Чому CLR-властивості недостатньо?",[2965,3046,3047],{},"Перш ніж зануритися у DependencyProperty, розберемося, чому звичайні C#-властивості (CLR properties) не підходять для UI-фреймворку.",[3049,3050,3052],"h3",{"id":3051},"обмеження-clr-властивостей","Обмеження CLR-властивостей",[2965,3054,3055],{},"Розглянемо типову CLR-властивість:",[3057,3058,3063],"pre",{"className":3059,"code":3060,"language":3061,"meta":3062,"style":3062},"language-csharp shiki shiki-themes light-plus dark-plus dark-plus","public class SimpleButton\n{\n    private Brush _background = Brushes.Gray;\n    \n    public Brush Background\n    {\n        get => _background;\n        set => _background = value;\n    }\n}\n","csharp","",[2969,3064,3065,3081,3088,3116,3122,3133,3139,3153,3170,3176],{"__ignoreMap":3062},[3066,3067,3070,3074,3077],"span",{"class":3068,"line":3069},"line",1,[3066,3071,3073],{"class":3072},"su1O8","public",[3066,3075,3076],{"class":3072}," class",[3066,3078,3080],{"class":3079},"sN1BT"," SimpleButton\n",[3066,3082,3084],{"class":3068,"line":3083},2,[3066,3085,3087],{"class":3086},"sHH4Y","{\n",[3066,3089,3091,3094,3097,3101,3104,3107,3110,3113],{"class":3068,"line":3090},3,[3066,3092,3093],{"class":3072},"    private",[3066,3095,3096],{"class":3079}," Brush",[3066,3098,3100],{"class":3099},"siwwj"," _background",[3066,3102,3103],{"class":3086}," = ",[3066,3105,3106],{"class":3099},"Brushes",[3066,3108,3109],{"class":3086},".",[3066,3111,3112],{"class":3099},"Gray",[3066,3114,3115],{"class":3086},";\n",[3066,3117,3119],{"class":3068,"line":3118},4,[3066,3120,3121],{"class":3086},"    \n",[3066,3123,3125,3128,3130],{"class":3068,"line":3124},5,[3066,3126,3127],{"class":3072},"    public",[3066,3129,3096],{"class":3079},[3066,3131,3132],{"class":3099}," Background\n",[3066,3134,3136],{"class":3068,"line":3135},6,[3066,3137,3138],{"class":3086},"    {\n",[3066,3140,3142,3145,3148,3151],{"class":3068,"line":3141},7,[3066,3143,3144],{"class":3072},"        get",[3066,3146,3147],{"class":3086}," => ",[3066,3149,3150],{"class":3099},"_background",[3066,3152,3115],{"class":3086},[3066,3154,3156,3159,3161,3163,3165,3168],{"class":3068,"line":3155},8,[3066,3157,3158],{"class":3072},"        set",[3066,3160,3147],{"class":3086},[3066,3162,3150],{"class":3099},[3066,3164,3103],{"class":3086},[3066,3166,3167],{"class":3099},"value",[3066,3169,3115],{"class":3086},[3066,3171,3173],{"class":3068,"line":3172},9,[3066,3174,3175],{"class":3086},"    }\n",[3066,3177,3179],{"class":3068,"line":3178},10,[3066,3180,3181],{"class":3086},"}\n",[2965,3183,3184],{},"Що не так з цим підходом у контексті UI?",[3186,3187,3188,3198,3203,3208,3221],"card-group",{},[3189,3190,3193,3194,3197],"card",{"icon":3191,"title":3192},"i-lucide-link-2-off","❌ Немає прив'язки даних","Setter не може автоматично повідомити UI про зміну значення. Потрібна ручна реалізація ",[2969,3195,3196],{},"INotifyPropertyChanged"," для кожної властивості.",[3189,3199,3202],{"icon":3200,"title":3201},"i-lucide-palette","❌ Немає стилізації","Неможливо задати значення через Style — setter перезапише будь-яке зовнішнє значення.",[3189,3204,3207],{"icon":3205,"title":3206},"i-lucide-film","❌ Немає анімацій","Анімаційний движок не може \"втрутитися\" у процес зміни значення — він не знає, коли і як оновлювати властивість.",[3189,3209,3212,3213,3216,3217,3220],{"icon":3210,"title":3211},"i-lucide-git-branch","❌ Немає успадкування","Значення ",[2969,3214,3215],{},"FontSize",", задане на ",[2969,3218,3219],{},"Window",", не може автоматично \"стекти\" до всіх дочірніх елементів.",[3189,3222,3224],{"icon":2354,"title":3223},"❌ Неефективне зберігання","Кожен контрол має ~100 властивостей. Якщо зберігати кожну як поле — це 100 полів × тисячі контролів = гігантська витрата пам'яті, навіть якщо більшість властивостей мають значення за замовчуванням.",[3049,3226,3228],{"id":3227},"реальний-приклад-проблеми","Реальний приклад проблеми",[2965,3230,3231],{},"Припустимо, ми хочемо створити систему тем для додатку:",[3057,3233,3235],{"className":3059,"code":3234,"language":3061,"meta":3062,"style":3062},"// ❌ Неправильний підхід з CLR-властивостями\npublic class ThemedButton\n{\n    private Brush _background;\n    \n    public Brush Background\n    {\n        get => _background ?? ThemeManager.Current.ButtonBackground; // Fallback до теми\n        set => _background = value;\n    }\n}\n",[2969,3236,3237,3243,3252,3256,3266,3270,3278,3282,3312,3326,3330],{"__ignoreMap":3062},[3066,3238,3239],{"class":3068,"line":3069},[3066,3240,3242],{"class":3241},"spJ8K","// ❌ Неправильний підхід з CLR-властивостями\n",[3066,3244,3245,3247,3249],{"class":3068,"line":3083},[3066,3246,3073],{"class":3072},[3066,3248,3076],{"class":3072},[3066,3250,3251],{"class":3079}," ThemedButton\n",[3066,3253,3254],{"class":3068,"line":3090},[3066,3255,3087],{"class":3086},[3066,3257,3258,3260,3262,3264],{"class":3068,"line":3118},[3066,3259,3093],{"class":3072},[3066,3261,3096],{"class":3079},[3066,3263,3100],{"class":3099},[3066,3265,3115],{"class":3086},[3066,3267,3268],{"class":3068,"line":3124},[3066,3269,3121],{"class":3086},[3066,3271,3272,3274,3276],{"class":3068,"line":3135},[3066,3273,3127],{"class":3072},[3066,3275,3096],{"class":3079},[3066,3277,3132],{"class":3099},[3066,3279,3280],{"class":3068,"line":3141},[3066,3281,3138],{"class":3086},[3066,3283,3284,3286,3288,3290,3293,3296,3298,3301,3303,3306,3309],{"class":3068,"line":3155},[3066,3285,3144],{"class":3072},[3066,3287,3147],{"class":3086},[3066,3289,3150],{"class":3099},[3066,3291,3292],{"class":3086}," ?? ",[3066,3294,3295],{"class":3099},"ThemeManager",[3066,3297,3109],{"class":3086},[3066,3299,3300],{"class":3099},"Current",[3066,3302,3109],{"class":3086},[3066,3304,3305],{"class":3099},"ButtonBackground",[3066,3307,3308],{"class":3086},"; ",[3066,3310,3311],{"class":3241},"// Fallback до теми\n",[3066,3313,3314,3316,3318,3320,3322,3324],{"class":3068,"line":3172},[3066,3315,3158],{"class":3072},[3066,3317,3147],{"class":3086},[3066,3319,3150],{"class":3099},[3066,3321,3103],{"class":3086},[3066,3323,3167],{"class":3099},[3066,3325,3115],{"class":3086},[3066,3327,3328],{"class":3068,"line":3178},[3066,3329,3175],{"class":3086},[3066,3331,3333],{"class":3068,"line":3332},11,[3066,3334,3181],{"class":3086},[2965,3336,3337],{},"Проблеми цього коду:",[3339,3340,3341,3347,3353,3363],"ol",{},[2977,3342,3343,3346],{},[2981,3344,3345],{},"Жорстка прив'язка до ThemeManager"," — порушення принципу інверсії залежностей",[2977,3348,3349,3352],{},[2981,3350,3351],{},"Немає пріоритетів"," — якщо задати локальне значення, тема ігнорується назавжди",[2977,3354,3355,3358,3359,3362],{},[2981,3356,3357],{},"Немає реакції на зміну теми"," — якщо ",[2969,3360,3361],{},"ThemeManager.Current"," змінився, кнопка не оновиться",[2977,3364,3365,3368],{},[2981,3366,3367],{},"Дублювання логіки"," — цей код треба повторити для кожної властивості кожного контролу",[3370,3371,3372,3373,3376,3377,3380],"warning",{},"У реальному WPF-проєкті може бути ",[2981,3374,3375],{},"тисячі контролів"," і ",[2981,3378,3379],{},"сотні властивостей",". Ручне управління пріоритетами, fallback-значеннями та сповіщеннями про зміни перетворилося б на кошмар підтримки.",[3039,3382],{},[2960,3384,3386],{"id":3385},"рішення-dependency-property-system","Рішення: Dependency Property System",[2965,3388,3389,3390,3393],{},"WPF вирішує всі ці проблеми через ",[2981,3391,3392],{},"централізовану систему властивостей",", де:",[2974,3395,3396,3405,3412,3419,3426],{},[2977,3397,3398,3399,3013,3402,3000],{},"Значення зберігаються не у полях класу, а у ",[2981,3400,3401],{},"спеціальному сховищі",[2969,3403,3404],{},"EffectiveValueEntry[]",[2977,3406,3407,3408,3411],{},"Кожна властивість має ",[2981,3409,3410],{},"метадані"," (default value, callbacks, прапорці поведінки)",[2977,3413,3414,3415,3418],{},"Система автоматично вирішує ",[2981,3416,3417],{},"конфлікти"," між різними джерелами значень",[2977,3420,3421,3422,3425],{},"Підтримується ",[2981,3423,3424],{},"успадкування"," значень по Logical Tree",[2977,3427,3428,3429,3432,3433,3436,3437],{},"Вбудована інтеграція з ",[2981,3430,3431],{},"Binding Engine",", ",[2981,3434,3435],{},"Animation System"," та ",[2981,3438,3439],{},"Style System",[3049,3441,3443],{"id":3442},"анатомія-dependency-property","Анатомія Dependency Property",[2965,3445,3446],{},"Dependency Property складається з трьох частин:",[3448,3449,3450],"mermaid",{},[3057,3451,3454],{"className":3452,"code":3453,"language":3448,"meta":3062,"style":3062},"language-mermaid shiki shiki-themes light-plus dark-plus dark-plus","graph LR\n    A[Static Field\u003Cbr/>DependencyProperty] --> B[Registration\u003Cbr/>DependencyProperty.Register]\n    B --> C[CLR Wrapper\u003Cbr/>get/set Property]\n    \n    style A fill:#3b82f6,stroke:#1d4ed8,color:#ffffff\n    style B fill:#f59e0b,stroke:#b45309,color:#ffffff\n    style C fill:#10b981,stroke:#059669,color:#ffffff\n",[2969,3455,3456,3461,3466,3471,3475,3480,3485],{"__ignoreMap":3062},[3066,3457,3458],{"class":3068,"line":3069},[3066,3459,3460],{},"graph LR\n",[3066,3462,3463],{"class":3068,"line":3083},[3066,3464,3465],{},"    A[Static Field\u003Cbr/>DependencyProperty] --> B[Registration\u003Cbr/>DependencyProperty.Register]\n",[3066,3467,3468],{"class":3068,"line":3090},[3066,3469,3470],{},"    B --> C[CLR Wrapper\u003Cbr/>get/set Property]\n",[3066,3472,3473],{"class":3068,"line":3118},[3066,3474,3121],{},[3066,3476,3477],{"class":3068,"line":3124},[3066,3478,3479],{},"    style A fill:#3b82f6,stroke:#1d4ed8,color:#ffffff\n",[3066,3481,3482],{"class":3068,"line":3135},[3066,3483,3484],{},"    style B fill:#f59e0b,stroke:#b45309,color:#ffffff\n",[3066,3486,3487],{"class":3068,"line":3141},[3066,3488,3489],{},"    style C fill:#10b981,stroke:#059669,color:#ffffff\n",[2965,3491,3492],{},"Розглянемо реальний приклад з WPF:",[3057,3494,3496],{"className":3059,"code":3495,"language":3061,"meta":3062,"style":3062},"public class Button : ButtonBase\n{\n    // 1️⃣ Статичне поле — ідентифікатор властивості\n    public static readonly DependencyProperty BackgroundProperty =\n        DependencyProperty.Register(\n            name: \"Background\",              // Назва властивості\n            propertyType: typeof(Brush),     // Тип значення\n            ownerType: typeof(Button),       // Клас-власник\n            typeMetadata: new FrameworkPropertyMetadata(\n                defaultValue: null,          // Значення за замовчуванням\n                flags: FrameworkPropertyMetadataOptions.AffectsRender\n            )\n        );\n    \n    // 2️⃣ CLR-обгортка для зручності\n    public Brush Background\n    {\n        get => (Brush)GetValue(BackgroundProperty);\n        set => SetValue(BackgroundProperty, value);\n    }\n}\n",[2969,3497,3498,3513,3517,3522,3541,3555,3573,3595,3615,3630,3646,3661,3667,3673,3678,3684,3693,3698,3721,3741,3746],{"__ignoreMap":3062},[3066,3499,3500,3502,3504,3507,3510],{"class":3068,"line":3069},[3066,3501,3073],{"class":3072},[3066,3503,3076],{"class":3072},[3066,3505,3506],{"class":3079}," Button",[3066,3508,3509],{"class":3086}," : ",[3066,3511,3512],{"class":3079},"ButtonBase\n",[3066,3514,3515],{"class":3068,"line":3083},[3066,3516,3087],{"class":3086},[3066,3518,3519],{"class":3068,"line":3090},[3066,3520,3521],{"class":3241},"    // 1️⃣ Статичне поле — ідентифікатор властивості\n",[3066,3523,3524,3526,3529,3532,3535,3538],{"class":3068,"line":3118},[3066,3525,3127],{"class":3072},[3066,3527,3528],{"class":3072}," static",[3066,3530,3531],{"class":3072}," readonly",[3066,3533,3534],{"class":3079}," DependencyProperty",[3066,3536,3537],{"class":3099}," BackgroundProperty",[3066,3539,3540],{"class":3086}," =\n",[3066,3542,3543,3546,3548,3552],{"class":3068,"line":3124},[3066,3544,3545],{"class":3099},"        DependencyProperty",[3066,3547,3109],{"class":3086},[3066,3549,3551],{"class":3550},"s8Opu","Register",[3066,3553,3554],{"class":3086},"(\n",[3066,3556,3557,3560,3563,3567,3570],{"class":3068,"line":3135},[3066,3558,3559],{"class":3099},"            name",[3066,3561,3562],{"class":3086},": ",[3066,3564,3566],{"class":3565},"sbdoH","\"Background\"",[3066,3568,3569],{"class":3086},",              ",[3066,3571,3572],{"class":3241},"// Назва властивості\n",[3066,3574,3575,3578,3580,3583,3586,3589,3592],{"class":3068,"line":3141},[3066,3576,3577],{"class":3099},"            propertyType",[3066,3579,3562],{"class":3086},[3066,3581,3582],{"class":3072},"typeof",[3066,3584,3585],{"class":3086},"(",[3066,3587,3588],{"class":3079},"Brush",[3066,3590,3591],{"class":3086},"),     ",[3066,3593,3594],{"class":3241},"// Тип значення\n",[3066,3596,3597,3600,3602,3604,3606,3609,3612],{"class":3068,"line":3155},[3066,3598,3599],{"class":3099},"            ownerType",[3066,3601,3562],{"class":3086},[3066,3603,3582],{"class":3072},[3066,3605,3585],{"class":3086},[3066,3607,3608],{"class":3079},"Button",[3066,3610,3611],{"class":3086},"),       ",[3066,3613,3614],{"class":3241},"// Клас-власник\n",[3066,3616,3617,3620,3622,3625,3628],{"class":3068,"line":3172},[3066,3618,3619],{"class":3099},"            typeMetadata",[3066,3621,3562],{"class":3086},[3066,3623,3624],{"class":3072},"new",[3066,3626,3627],{"class":3079}," FrameworkPropertyMetadata",[3066,3629,3554],{"class":3086},[3066,3631,3632,3635,3637,3640,3643],{"class":3068,"line":3178},[3066,3633,3634],{"class":3099},"                defaultValue",[3066,3636,3562],{"class":3086},[3066,3638,3639],{"class":3072},"null",[3066,3641,3642],{"class":3086},",          ",[3066,3644,3645],{"class":3241},"// Значення за замовчуванням\n",[3066,3647,3648,3651,3653,3656,3658],{"class":3068,"line":3332},[3066,3649,3650],{"class":3099},"                flags",[3066,3652,3562],{"class":3086},[3066,3654,3655],{"class":3099},"FrameworkPropertyMetadataOptions",[3066,3657,3109],{"class":3086},[3066,3659,3660],{"class":3099},"AffectsRender\n",[3066,3662,3664],{"class":3068,"line":3663},12,[3066,3665,3666],{"class":3086},"            )\n",[3066,3668,3670],{"class":3068,"line":3669},13,[3066,3671,3672],{"class":3086},"        );\n",[3066,3674,3676],{"class":3068,"line":3675},14,[3066,3677,3121],{"class":3086},[3066,3679,3681],{"class":3068,"line":3680},15,[3066,3682,3683],{"class":3241},"    // 2️⃣ CLR-обгортка для зручності\n",[3066,3685,3687,3689,3691],{"class":3068,"line":3686},16,[3066,3688,3127],{"class":3072},[3066,3690,3096],{"class":3079},[3066,3692,3132],{"class":3099},[3066,3694,3696],{"class":3068,"line":3695},17,[3066,3697,3138],{"class":3086},[3066,3699,3701,3703,3706,3708,3710,3713,3715,3718],{"class":3068,"line":3700},18,[3066,3702,3144],{"class":3072},[3066,3704,3705],{"class":3086}," => (",[3066,3707,3588],{"class":3079},[3066,3709,3000],{"class":3086},[3066,3711,3712],{"class":3550},"GetValue",[3066,3714,3585],{"class":3086},[3066,3716,3717],{"class":3099},"BackgroundProperty",[3066,3719,3720],{"class":3086},");\n",[3066,3722,3724,3726,3728,3731,3733,3735,3737,3739],{"class":3068,"line":3723},19,[3066,3725,3158],{"class":3072},[3066,3727,3147],{"class":3086},[3066,3729,3730],{"class":3550},"SetValue",[3066,3732,3585],{"class":3086},[3066,3734,3717],{"class":3099},[3066,3736,3432],{"class":3086},[3066,3738,3167],{"class":3099},[3066,3740,3720],{"class":3086},[3066,3742,3744],{"class":3068,"line":3743},20,[3066,3745,3175],{"class":3086},[3066,3747,3749],{"class":3068,"line":3748},21,[3066,3750,3181],{"class":3086},[3752,3753,3754,3757,3758,3761],"tip",{},[2981,3755,3756],{},"Naming Convention:"," Статичне поле завжди називається ",[2969,3759,3760],{},"{PropertyName}Property",". Це дозволяє легко знаходити DependencyProperty через рефлексію та забезпечує консистентність API.",[3049,3763,3765],{"id":3764},"чому-dependency","Чому \"Dependency\"?",[2965,3767,3768,3769,3772],{},"Назва \"Dependency Property\" означає, що ",[2981,3770,3771],{},"значення властивості залежить від багатьох джерел",". WPF автоматично визначає, яке джерело має найвищий пріоритет, і повертає відповідне значення.",[3057,3774,3776],{"className":3059,"code":3775,"language":3061,"meta":3062,"style":3062},"// Коли ви пишете:\nmyButton.Background = Brushes.Red;\n\n// Насправді відбувається:\nmyButton.SetValue(Button.BackgroundProperty, Brushes.Red);\n\n// А коли читаєте:\nvar color = myButton.Background;\n\n// WPF виконує складну логіку:\n// 1. Перевіряє, чи є активна анімація\n// 2. Перевіряє локальне значення\n// 3. Перевіряє Style Triggers\n// 4. Перевіряє Style Setters\n// 5. Перевіряє успадковане значення\n// 6. Повертає default value\n",[2969,3777,3778,3783,3803,3809,3814,3840,3844,3849,3867,3871,3876,3881,3886,3891,3896,3901],{"__ignoreMap":3062},[3066,3779,3780],{"class":3068,"line":3069},[3066,3781,3782],{"class":3241},"// Коли ви пишете:\n",[3066,3784,3785,3788,3790,3792,3794,3796,3798,3801],{"class":3068,"line":3083},[3066,3786,3787],{"class":3099},"myButton",[3066,3789,3109],{"class":3086},[3066,3791,2971],{"class":3099},[3066,3793,3103],{"class":3086},[3066,3795,3106],{"class":3099},[3066,3797,3109],{"class":3086},[3066,3799,3800],{"class":3099},"Red",[3066,3802,3115],{"class":3086},[3066,3804,3805],{"class":3068,"line":3090},[3066,3806,3808],{"emptyLinePlaceholder":3807},true,"\n",[3066,3810,3811],{"class":3068,"line":3118},[3066,3812,3813],{"class":3241},"// Насправді відбувається:\n",[3066,3815,3816,3818,3820,3822,3824,3826,3828,3830,3832,3834,3836,3838],{"class":3068,"line":3124},[3066,3817,3787],{"class":3099},[3066,3819,3109],{"class":3086},[3066,3821,3730],{"class":3550},[3066,3823,3585],{"class":3086},[3066,3825,3608],{"class":3099},[3066,3827,3109],{"class":3086},[3066,3829,3717],{"class":3099},[3066,3831,3432],{"class":3086},[3066,3833,3106],{"class":3099},[3066,3835,3109],{"class":3086},[3066,3837,3800],{"class":3099},[3066,3839,3720],{"class":3086},[3066,3841,3842],{"class":3068,"line":3135},[3066,3843,3808],{"emptyLinePlaceholder":3807},[3066,3845,3846],{"class":3068,"line":3141},[3066,3847,3848],{"class":3241},"// А коли читаєте:\n",[3066,3850,3851,3854,3857,3859,3861,3863,3865],{"class":3068,"line":3155},[3066,3852,3853],{"class":3072},"var",[3066,3855,3856],{"class":3099}," color",[3066,3858,3103],{"class":3086},[3066,3860,3787],{"class":3099},[3066,3862,3109],{"class":3086},[3066,3864,2971],{"class":3099},[3066,3866,3115],{"class":3086},[3066,3868,3869],{"class":3068,"line":3172},[3066,3870,3808],{"emptyLinePlaceholder":3807},[3066,3872,3873],{"class":3068,"line":3178},[3066,3874,3875],{"class":3241},"// WPF виконує складну логіку:\n",[3066,3877,3878],{"class":3068,"line":3332},[3066,3879,3880],{"class":3241},"// 1. Перевіряє, чи є активна анімація\n",[3066,3882,3883],{"class":3068,"line":3663},[3066,3884,3885],{"class":3241},"// 2. Перевіряє локальне значення\n",[3066,3887,3888],{"class":3068,"line":3669},[3066,3889,3890],{"class":3241},"// 3. Перевіряє Style Triggers\n",[3066,3892,3893],{"class":3068,"line":3675},[3066,3894,3895],{"class":3241},"// 4. Перевіряє Style Setters\n",[3066,3897,3898],{"class":3068,"line":3680},[3066,3899,3900],{"class":3241},"// 5. Перевіряє успадковане значення\n",[3066,3902,3903],{"class":3068,"line":3686},[3066,3904,3905],{"class":3241},"// 6. Повертає default value\n",[3039,3907],{},[2960,3909,3911],{"id":3910},"value-resolution-система-пріоритетів","Value Resolution: Система пріоритетів",[2965,3913,3914,3915,3918],{},"Коли WPF потрібно отримати значення Dependency Property, він проходить через ",[2981,3916,3917],{},"ланцюжок пріоритетів"," (Property Value Precedence). Це впорядкований список джерел значень — від найвищого пріоритету до найнижчого.",[3049,3920,3922],{"id":3921},"таблиця-пріоритетів","Таблиця пріоритетів",[3032,3924,3925,3928],{},[2981,3926,3927],{},"Важливо:"," Чим вище у таблиці — тим вищий пріоритет. Якщо знайдено значення на певному рівні, нижчі рівні ігноруються.",[3930,3931,3932,3951],"table",{},[3933,3934,3935],"thead",{},[3936,3937,3938,3942,3945,3948],"tr",{},[3939,3940,3941],"th",{},"Пріоритет",[3939,3943,3944],{},"Джерело",[3939,3946,3947],{},"Опис",[3939,3949,3950],{},"Приклад",[3952,3953,3954,3977,3998,4016,4032,4050,4068,4092],"tbody",{},[3936,3955,3956,3962,3965,3968],{},[3957,3958,3959],"td",{},[2981,3960,3961],{},"1",[3957,3963,3964],{},"Animation (Active)",[3957,3966,3967],{},"Активна анімація змінює значення",[3957,3969,3970,3973,3974],{},[2969,3971,3972],{},"DoubleAnimation"," для ",[2969,3975,3976],{},"Opacity",[3936,3978,3979,3984,3987,3990],{},[3957,3980,3981],{},[2981,3982,3983],{},"2",[3957,3985,3986],{},"Local Value",[3957,3988,3989],{},"Значення, задане напряму через код або XAML",[3957,3991,3992,3994,3995],{},[2969,3993,2999],{}," або ",[2969,3996,3997],{},"SetValue()",[3936,3999,4000,4005,4008,4011],{},[3957,4001,4002],{},[2981,4003,4004],{},"3",[3957,4006,4007],{},"Style Triggers",[3957,4009,4010],{},"Тригери у стилі елемента",[3957,4012,4013],{},[2969,4014,4015],{},"\u003CTrigger Property=\"IsMouseOver\">",[3936,4017,4018,4023,4026,4029],{},[3957,4019,4020],{},[2981,4021,4022],{},"4",[3957,4024,4025],{},"Template Triggers",[3957,4027,4028],{},"Тригери у ControlTemplate",[3957,4030,4031],{},"Зміна кольору кнопки при натисканні",[3936,4033,4034,4039,4042,4045],{},[3957,4035,4036],{},[2981,4037,4038],{},"5",[3957,4040,4041],{},"Style Setters",[3957,4043,4044],{},"Setter'и у стилі елемента",[3957,4046,4047],{},[2969,4048,4049],{},"\u003CSetter Property=\"Background\">",[3936,4051,4052,4057,4060,4063],{},[3957,4053,4054],{},[2981,4055,4056],{},"6",[3957,4058,4059],{},"Theme Style",[3957,4061,4062],{},"Стиль з теми WPF (Aero, Luna)",[3957,4064,4065,4066],{},"Стандартний вигляд ",[2969,4067,3608],{},[3936,4069,4070,4075,4078,4081],{},[3957,4071,4072],{},[2981,4073,4074],{},"7",[3957,4076,4077],{},"Property Value Inheritance",[3957,4079,4080],{},"Успадковане значення від батьківського елемента",[3957,4082,4083,4085,4086,4088,4089],{},[2969,4084,3215],{}," від ",[2969,4087,3219],{}," до ",[2969,4090,4091],{},"TextBlock",[3936,4093,4094,4099,4102,4108],{},[3957,4095,4096],{},[2981,4097,4098],{},"8",[3957,4100,4101],{},"Default Value",[3957,4103,4104,4105],{},"Значення з ",[2969,4106,4107],{},"PropertyMetadata.DefaultValue",[3957,4109,4110,3973,4112],{},[2969,4111,3639],{},[2969,4113,2971],{},[3049,4115,4117],{"id":4116},"візуалізація-процесу","Візуалізація процесу",[3448,4119,4120],{},[3057,4121,4123],{"className":3452,"code":4122,"language":3448,"meta":3062,"style":3062},"graph TD\n    Start[GetValue Background] --> Anim{Активна\u003Cbr/>анімація?}\n    Anim -->|Так| ReturnAnim[Повернути\u003Cbr/>анімоване значення]\n    Anim -->|Ні| Local{Локальне\u003Cbr/>значення?}\n    \n    Local -->|Так| ReturnLocal[Повернути\u003Cbr/>Local Value]\n    Local -->|Ні| StyleTrigger{Style\u003Cbr/>Trigger?}\n    \n    StyleTrigger -->|Так| ReturnTrigger[Повернути\u003Cbr/>Trigger Value]\n    StyleTrigger -->|Ні| StyleSetter{Style\u003Cbr/>Setter?}\n    \n    StyleSetter -->|Так| ReturnSetter[Повернути\u003Cbr/>Setter Value]\n    StyleSetter -->|Ні| Inherited{Успадковане\u003Cbr/>значення?}\n    \n    Inherited -->|Так| ReturnInherited[Повернути\u003Cbr/>Inherited Value]\n    Inherited -->|Ні| ReturnDefault[Повернути\u003Cbr/>Default Value]\n    \n    style ReturnAnim fill:#ef4444,stroke:#b91c1c,color:#ffffff\n    style ReturnLocal fill:#f59e0b,stroke:#b45309,color:#ffffff\n    style ReturnTrigger fill:#3b82f6,stroke:#1d4ed8,color:#ffffff\n    style ReturnSetter fill:#10b981,stroke:#059669,color:#ffffff\n    style ReturnInherited fill:#8b5cf6,stroke:#6d28d9,color:#ffffff\n    style ReturnDefault fill:#64748b,stroke:#334155,color:#ffffff\n",[2969,4124,4125,4130,4135,4140,4145,4149,4154,4159,4163,4168,4173,4177,4182,4187,4191,4196,4201,4205,4210,4215,4220,4225,4231],{"__ignoreMap":3062},[3066,4126,4127],{"class":3068,"line":3069},[3066,4128,4129],{},"graph TD\n",[3066,4131,4132],{"class":3068,"line":3083},[3066,4133,4134],{},"    Start[GetValue Background] --> Anim{Активна\u003Cbr/>анімація?}\n",[3066,4136,4137],{"class":3068,"line":3090},[3066,4138,4139],{},"    Anim -->|Так| ReturnAnim[Повернути\u003Cbr/>анімоване значення]\n",[3066,4141,4142],{"class":3068,"line":3118},[3066,4143,4144],{},"    Anim -->|Ні| Local{Локальне\u003Cbr/>значення?}\n",[3066,4146,4147],{"class":3068,"line":3124},[3066,4148,3121],{},[3066,4150,4151],{"class":3068,"line":3135},[3066,4152,4153],{},"    Local -->|Так| ReturnLocal[Повернути\u003Cbr/>Local Value]\n",[3066,4155,4156],{"class":3068,"line":3141},[3066,4157,4158],{},"    Local -->|Ні| StyleTrigger{Style\u003Cbr/>Trigger?}\n",[3066,4160,4161],{"class":3068,"line":3155},[3066,4162,3121],{},[3066,4164,4165],{"class":3068,"line":3172},[3066,4166,4167],{},"    StyleTrigger -->|Так| ReturnTrigger[Повернути\u003Cbr/>Trigger Value]\n",[3066,4169,4170],{"class":3068,"line":3178},[3066,4171,4172],{},"    StyleTrigger -->|Ні| StyleSetter{Style\u003Cbr/>Setter?}\n",[3066,4174,4175],{"class":3068,"line":3332},[3066,4176,3121],{},[3066,4178,4179],{"class":3068,"line":3663},[3066,4180,4181],{},"    StyleSetter -->|Так| ReturnSetter[Повернути\u003Cbr/>Setter Value]\n",[3066,4183,4184],{"class":3068,"line":3669},[3066,4185,4186],{},"    StyleSetter -->|Ні| Inherited{Успадковане\u003Cbr/>значення?}\n",[3066,4188,4189],{"class":3068,"line":3675},[3066,4190,3121],{},[3066,4192,4193],{"class":3068,"line":3680},[3066,4194,4195],{},"    Inherited -->|Так| ReturnInherited[Повернути\u003Cbr/>Inherited Value]\n",[3066,4197,4198],{"class":3068,"line":3686},[3066,4199,4200],{},"    Inherited -->|Ні| ReturnDefault[Повернути\u003Cbr/>Default Value]\n",[3066,4202,4203],{"class":3068,"line":3695},[3066,4204,3121],{},[3066,4206,4207],{"class":3068,"line":3700},[3066,4208,4209],{},"    style ReturnAnim fill:#ef4444,stroke:#b91c1c,color:#ffffff\n",[3066,4211,4212],{"class":3068,"line":3723},[3066,4213,4214],{},"    style ReturnLocal fill:#f59e0b,stroke:#b45309,color:#ffffff\n",[3066,4216,4217],{"class":3068,"line":3743},[3066,4218,4219],{},"    style ReturnTrigger fill:#3b82f6,stroke:#1d4ed8,color:#ffffff\n",[3066,4221,4222],{"class":3068,"line":3748},[3066,4223,4224],{},"    style ReturnSetter fill:#10b981,stroke:#059669,color:#ffffff\n",[3066,4226,4228],{"class":3068,"line":4227},22,[3066,4229,4230],{},"    style ReturnInherited fill:#8b5cf6,stroke:#6d28d9,color:#ffffff\n",[3066,4232,4234],{"class":3068,"line":4233},23,[3066,4235,4236],{},"    style ReturnDefault fill:#64748b,stroke:#334155,color:#ffffff\n",[3039,4238],{},[2960,4240,4242],{"id":4241},"практичні-приклади-value-resolution","Практичні приклади Value Resolution",[2965,4244,4245],{},"Розберемо кілька реальних сценаріїв, щоб зрозуміти, як працює система пріоритетів.",[3049,4247,4249],{"id":4248},"приклад-1-конфлікт-style-vs-local-value","Приклад 1: Конфлікт Style vs Local Value",[3057,4251,4255],{"className":4252,"code":4253,"language":4254,"meta":3062,"style":3062},"language-xml shiki shiki-themes light-plus dark-plus dark-plus","\u003CWindow.Resources>\n    \u003CStyle TargetType=\"Button\">\n        \u003CSetter Property=\"Background\" Value=\"Blue\"/>\n        \u003CSetter Property=\"Foreground\" Value=\"White\"/>\n    \u003C/Style>\n\u003C/Window.Resources>\n\n\u003CStackPanel Margin=\"20\">\n    \u003CButton Content=\"Кнопка 1\"/>\n    \u003CButton Content=\"Кнопка 2\" Background=\"Red\"/>\n\u003C/StackPanel>\n","xml",[2969,4256,4257,4270,4291,4317,4339,4348,4357,4361,4378,4394,4417],{"__ignoreMap":3062},[3066,4258,4259,4263,4267],{"class":3068,"line":3069},[3066,4260,4262],{"class":4261},"s0P7L","\u003C",[3066,4264,4266],{"class":4265},"sKtos","Window.Resources",[3066,4268,4269],{"class":4261},">\n",[3066,4271,4272,4275,4278,4282,4285,4289],{"class":3068,"line":3083},[3066,4273,4274],{"class":4261},"    \u003C",[3066,4276,4277],{"class":4265},"Style",[3066,4279,4281],{"class":4280},"sa4r_"," TargetType",[3066,4283,4284],{"class":3086},"=",[3066,4286,4288],{"class":4287},"su9tN","\"Button\"",[3066,4290,4269],{"class":4261},[3066,4292,4293,4296,4299,4302,4304,4306,4309,4311,4314],{"class":3068,"line":3090},[3066,4294,4295],{"class":4261},"        \u003C",[3066,4297,4298],{"class":4265},"Setter",[3066,4300,4301],{"class":4280}," Property",[3066,4303,4284],{"class":3086},[3066,4305,3566],{"class":4287},[3066,4307,4308],{"class":4280}," Value",[3066,4310,4284],{"class":3086},[3066,4312,4313],{"class":4287},"\"Blue\"",[3066,4315,4316],{"class":4261},"/>\n",[3066,4318,4319,4321,4323,4325,4327,4330,4332,4334,4337],{"class":3068,"line":3118},[3066,4320,4295],{"class":4261},[3066,4322,4298],{"class":4265},[3066,4324,4301],{"class":4280},[3066,4326,4284],{"class":3086},[3066,4328,4329],{"class":4287},"\"Foreground\"",[3066,4331,4308],{"class":4280},[3066,4333,4284],{"class":3086},[3066,4335,4336],{"class":4287},"\"White\"",[3066,4338,4316],{"class":4261},[3066,4340,4341,4344,4346],{"class":3068,"line":3124},[3066,4342,4343],{"class":4261},"    \u003C/",[3066,4345,4277],{"class":4265},[3066,4347,4269],{"class":4261},[3066,4349,4350,4353,4355],{"class":3068,"line":3135},[3066,4351,4352],{"class":4261},"\u003C/",[3066,4354,4266],{"class":4265},[3066,4356,4269],{"class":4261},[3066,4358,4359],{"class":3068,"line":3141},[3066,4360,3808],{"emptyLinePlaceholder":3807},[3066,4362,4363,4365,4368,4371,4373,4376],{"class":3068,"line":3155},[3066,4364,4262],{"class":4261},[3066,4366,4367],{"class":4265},"StackPanel",[3066,4369,4370],{"class":4280}," Margin",[3066,4372,4284],{"class":3086},[3066,4374,4375],{"class":4287},"\"20\"",[3066,4377,4269],{"class":4261},[3066,4379,4380,4382,4384,4387,4389,4392],{"class":3068,"line":3172},[3066,4381,4274],{"class":4261},[3066,4383,3608],{"class":4265},[3066,4385,4386],{"class":4280}," Content",[3066,4388,4284],{"class":3086},[3066,4390,4391],{"class":4287},"\"Кнопка 1\"",[3066,4393,4316],{"class":4261},[3066,4395,4396,4398,4400,4402,4404,4407,4410,4412,4415],{"class":3068,"line":3178},[3066,4397,4274],{"class":4261},[3066,4399,3608],{"class":4265},[3066,4401,4386],{"class":4280},[3066,4403,4284],{"class":3086},[3066,4405,4406],{"class":4287},"\"Кнопка 2\"",[3066,4408,4409],{"class":4280}," Background",[3066,4411,4284],{"class":3086},[3066,4413,4414],{"class":4287},"\"Red\"",[3066,4416,4316],{"class":4261},[3066,4418,4419,4421,4423],{"class":3068,"line":3332},[3066,4420,4352],{"class":4261},[3066,4422,4367],{"class":4265},[3066,4424,4269],{"class":4261},[2965,4426,4427],{},[2981,4428,4429],{},"Що відбувається:",[2974,4431,4432,4441],{},[2977,4433,4434,4437,4438],{},[2981,4435,4436],{},"Кнопка 1",": Немає локального значення → використовується Style Setter → ",[2969,4439,4440],{},"Background = Blue",[2977,4442,4443,4446,4447,4449,4450],{},[2981,4444,4445],{},"Кнопка 2",": Є локальне значення ",[2969,4448,2999],{}," → воно має вищий пріоритет → ",[2969,4451,4452],{},"Background = Red",[4454,4455,4457],"wpf-preview",{"title":4456},"Style vs Local Value",[3057,4458,4460],{"className":4252,"code":4459,"language":4254,"meta":3062,"style":3062},"\u003CStackPanel Margin=\"20\" Spacing=\"10\">\n  \u003CButton Content=\"Кнопка зі стилем (синя)\"/>\n  \u003CButton Content=\"Кнопка з локальним значенням (червона)\" Background=\"Red\"/>\n\u003C/StackPanel>\n",[2969,4461,4462,4484,4500,4521],{"__ignoreMap":3062},[3066,4463,4464,4466,4468,4470,4472,4474,4477,4479,4482],{"class":3068,"line":3069},[3066,4465,4262],{"class":4261},[3066,4467,4367],{"class":4265},[3066,4469,4370],{"class":4280},[3066,4471,4284],{"class":3086},[3066,4473,4375],{"class":4287},[3066,4475,4476],{"class":4280}," Spacing",[3066,4478,4284],{"class":3086},[3066,4480,4481],{"class":4287},"\"10\"",[3066,4483,4269],{"class":4261},[3066,4485,4486,4489,4491,4493,4495,4498],{"class":3068,"line":3083},[3066,4487,4488],{"class":4261},"  \u003C",[3066,4490,3608],{"class":4265},[3066,4492,4386],{"class":4280},[3066,4494,4284],{"class":3086},[3066,4496,4497],{"class":4287},"\"Кнопка зі стилем (синя)\"",[3066,4499,4316],{"class":4261},[3066,4501,4502,4504,4506,4508,4510,4513,4515,4517,4519],{"class":3068,"line":3090},[3066,4503,4488],{"class":4261},[3066,4505,3608],{"class":4265},[3066,4507,4386],{"class":4280},[3066,4509,4284],{"class":3086},[3066,4511,4512],{"class":4287},"\"Кнопка з локальним значенням (червона)\"",[3066,4514,4409],{"class":4280},[3066,4516,4284],{"class":3086},[3066,4518,4414],{"class":4287},[3066,4520,4316],{"class":4261},[3066,4522,4523,4525,4527],{"class":3068,"line":3118},[3066,4524,4352],{"class":4261},[3066,4526,4367],{"class":4265},[3066,4528,4269],{"class":4261},[3752,4530,4531,4534],{},[2981,4532,4533],{},"Ключовий момент:"," Локальне значення завжди \"перемагає\" стиль. Це дозволяє перевизначати стилі для окремих елементів без створення нових стилів.",[3049,4536,4538],{"id":4537},"приклад-2-clearvalue-скидання-локального-значення","Приклад 2: ClearValue() — скидання локального значення",[2965,4540,4541],{},"Що робити, якщо ми хочемо повернутися до стилю після встановлення локального значення?",[3057,4543,4545],{"className":3059,"code":4544,"language":3061,"meta":3062,"style":3062},"// Встановлюємо локальне значення\nmyButton.Background = Brushes.Red;\n\n// Тепер Background = Red (Local Value, пріоритет 2)\n\n// Скидаємо локальне значення\nmyButton.ClearValue(Button.BackgroundProperty);\n\n// Тепер Background = Blue (Style Setter, пріоритет 5)\n",[2969,4546,4547,4552,4570,4574,4579,4583,4588,4607,4611],{"__ignoreMap":3062},[3066,4548,4549],{"class":3068,"line":3069},[3066,4550,4551],{"class":3241},"// Встановлюємо локальне значення\n",[3066,4553,4554,4556,4558,4560,4562,4564,4566,4568],{"class":3068,"line":3083},[3066,4555,3787],{"class":3099},[3066,4557,3109],{"class":3086},[3066,4559,2971],{"class":3099},[3066,4561,3103],{"class":3086},[3066,4563,3106],{"class":3099},[3066,4565,3109],{"class":3086},[3066,4567,3800],{"class":3099},[3066,4569,3115],{"class":3086},[3066,4571,4572],{"class":3068,"line":3090},[3066,4573,3808],{"emptyLinePlaceholder":3807},[3066,4575,4576],{"class":3068,"line":3118},[3066,4577,4578],{"class":3241},"// Тепер Background = Red (Local Value, пріоритет 2)\n",[3066,4580,4581],{"class":3068,"line":3124},[3066,4582,3808],{"emptyLinePlaceholder":3807},[3066,4584,4585],{"class":3068,"line":3135},[3066,4586,4587],{"class":3241},"// Скидаємо локальне значення\n",[3066,4589,4590,4592,4594,4597,4599,4601,4603,4605],{"class":3068,"line":3141},[3066,4591,3787],{"class":3099},[3066,4593,3109],{"class":3086},[3066,4595,4596],{"class":3550},"ClearValue",[3066,4598,3585],{"class":3086},[3066,4600,3608],{"class":3099},[3066,4602,3109],{"class":3086},[3066,4604,3717],{"class":3099},[3066,4606,3720],{"class":3086},[3066,4608,4609],{"class":3068,"line":3155},[3066,4610,3808],{"emptyLinePlaceholder":3807},[3066,4612,4613],{"class":3068,"line":3172},[3066,4614,4615],{"class":3241},"// Тепер Background = Blue (Style Setter, пріоритет 5)\n",[3032,4617,4618,4621,4622,4625,4626,4628],{},[2969,4619,4620],{},"ClearValue()"," ",[2981,4623,4624],{},"не встановлює"," значення у ",[2969,4627,3639],{},". Він видаляє локальне значення зі сховища, дозволяючи системі пріоритетів \"провалитися\" на наступний рівень (Style, Theme, Default).",[3049,4630,4632],{"id":4631},"приклад-3-property-value-inheritance","Приклад 3: Property Value Inheritance",[2965,4634,4635,4636,3109],{},"Деякі властивості автоматично \"стікають\" по дереву елементів від батька до дітей. Це називається ",[2981,4637,4077],{},[3057,4639,4641],{"className":4252,"code":4640,"language":4254,"meta":3062,"style":3062},"\u003CWindow FontSize=\"16\" FontFamily=\"Segoe UI\">\n    \u003CStackPanel>\n        \u003CTextBlock Text=\"Цей текст успадковує FontSize=16\"/>\n        \u003CTextBlock Text=\"І цей теж\" FontWeight=\"Bold\"/>\n        \u003CButton Content=\"Кнопка теж успадковує шрифт\"/>\n    \u003C/StackPanel>\n\u003C/Window>\n",[2969,4642,4643,4667,4675,4691,4714,4729,4737],{"__ignoreMap":3062},[3066,4644,4645,4647,4649,4652,4654,4657,4660,4662,4665],{"class":3068,"line":3069},[3066,4646,4262],{"class":4261},[3066,4648,3219],{"class":4265},[3066,4650,4651],{"class":4280}," FontSize",[3066,4653,4284],{"class":3086},[3066,4655,4656],{"class":4287},"\"16\"",[3066,4658,4659],{"class":4280}," FontFamily",[3066,4661,4284],{"class":3086},[3066,4663,4664],{"class":4287},"\"Segoe UI\"",[3066,4666,4269],{"class":4261},[3066,4668,4669,4671,4673],{"class":3068,"line":3083},[3066,4670,4274],{"class":4261},[3066,4672,4367],{"class":4265},[3066,4674,4269],{"class":4261},[3066,4676,4677,4679,4681,4684,4686,4689],{"class":3068,"line":3090},[3066,4678,4295],{"class":4261},[3066,4680,4091],{"class":4265},[3066,4682,4683],{"class":4280}," Text",[3066,4685,4284],{"class":3086},[3066,4687,4688],{"class":4287},"\"Цей текст успадковує FontSize=16\"",[3066,4690,4316],{"class":4261},[3066,4692,4693,4695,4697,4699,4701,4704,4707,4709,4712],{"class":3068,"line":3118},[3066,4694,4295],{"class":4261},[3066,4696,4091],{"class":4265},[3066,4698,4683],{"class":4280},[3066,4700,4284],{"class":3086},[3066,4702,4703],{"class":4287},"\"І цей теж\"",[3066,4705,4706],{"class":4280}," FontWeight",[3066,4708,4284],{"class":3086},[3066,4710,4711],{"class":4287},"\"Bold\"",[3066,4713,4316],{"class":4261},[3066,4715,4716,4718,4720,4722,4724,4727],{"class":3068,"line":3124},[3066,4717,4295],{"class":4261},[3066,4719,3608],{"class":4265},[3066,4721,4386],{"class":4280},[3066,4723,4284],{"class":3086},[3066,4725,4726],{"class":4287},"\"Кнопка теж успадковує шрифт\"",[3066,4728,4316],{"class":4261},[3066,4730,4731,4733,4735],{"class":3068,"line":3135},[3066,4732,4343],{"class":4261},[3066,4734,4367],{"class":4265},[3066,4736,4269],{"class":4261},[3066,4738,4739,4741,4743],{"class":3068,"line":3141},[3066,4740,4352],{"class":4261},[3066,4742,3219],{"class":4265},[3066,4744,4269],{"class":4261},[2965,4746,4747],{},[2981,4748,4749],{},"Які властивості підтримують Inheritance?",[3930,4751,4752,4765],{},[3933,4753,4754],{},[3936,4755,4756,4759,4762],{},[3939,4757,4758],{},"Властивість",[3939,4760,4761],{},"Успадковується?",[3939,4763,4764],{},"Чому?",[3952,4766,4767,4779,4791,4803,4815],{},[3936,4768,4769,4773,4776],{},[3957,4770,4771],{},[2969,4772,3215],{},[3957,4774,4775],{},"✅ Так",[3957,4777,4778],{},"Логічно, щоб весь текст у вікні мав однаковий розмір",[3936,4780,4781,4786,4788],{},[3957,4782,4783],{},[2969,4784,4785],{},"FontFamily",[3957,4787,4775],{},[3957,4789,4790],{},"Консистентність типографіки",[3936,4792,4793,4798,4800],{},[3957,4794,4795],{},[2969,4796,4797],{},"Foreground",[3957,4799,4775],{},[3957,4801,4802],{},"Колір тексту має бути єдиним для всього інтерфейсу",[3936,4804,4805,4809,4812],{},[3957,4806,4807],{},[2969,4808,2971],{},[3957,4810,4811],{},"❌ Ні",[3957,4813,4814],{},"Кожен контрол має свій фон",[3936,4816,4817,4826,4828],{},[3957,4818,4819,4822,4823],{},[2969,4820,4821],{},"Width"," / ",[2969,4824,4825],{},"Height",[3957,4827,4811],{},[3957,4829,4830],{},"Розміри індивідуальні для кожного елемента",[4454,4832,4833],{"title":4077},[3057,4834,4836],{"className":4252,"code":4835,"language":4254,"meta":3062,"style":3062},"\u003CStackPanel Margin=\"20\" Spacing=\"10\" FontSize=\"18\" Foreground=\"DarkBlue\">\n  \u003CTextBlock Text=\"Успадкований FontSize=18 та Foreground=DarkBlue\"/>\n  \u003CTextBlock Text=\"Теж успадкований\" FontWeight=\"Bold\"/>\n  \u003CButton Content=\"Кнопка з успадкованим шрифтом\"/>\n\u003C/StackPanel>\n",[2969,4837,4838,4873,4888,4909,4924],{"__ignoreMap":3062},[3066,4839,4840,4842,4844,4846,4848,4850,4852,4854,4856,4858,4860,4863,4866,4868,4871],{"class":3068,"line":3069},[3066,4841,4262],{"class":4261},[3066,4843,4367],{"class":4265},[3066,4845,4370],{"class":4280},[3066,4847,4284],{"class":3086},[3066,4849,4375],{"class":4287},[3066,4851,4476],{"class":4280},[3066,4853,4284],{"class":3086},[3066,4855,4481],{"class":4287},[3066,4857,4651],{"class":4280},[3066,4859,4284],{"class":3086},[3066,4861,4862],{"class":4287},"\"18\"",[3066,4864,4865],{"class":4280}," Foreground",[3066,4867,4284],{"class":3086},[3066,4869,4870],{"class":4287},"\"DarkBlue\"",[3066,4872,4269],{"class":4261},[3066,4874,4875,4877,4879,4881,4883,4886],{"class":3068,"line":3083},[3066,4876,4488],{"class":4261},[3066,4878,4091],{"class":4265},[3066,4880,4683],{"class":4280},[3066,4882,4284],{"class":3086},[3066,4884,4885],{"class":4287},"\"Успадкований FontSize=18 та Foreground=DarkBlue\"",[3066,4887,4316],{"class":4261},[3066,4889,4890,4892,4894,4896,4898,4901,4903,4905,4907],{"class":3068,"line":3090},[3066,4891,4488],{"class":4261},[3066,4893,4091],{"class":4265},[3066,4895,4683],{"class":4280},[3066,4897,4284],{"class":3086},[3066,4899,4900],{"class":4287},"\"Теж успадкований\"",[3066,4902,4706],{"class":4280},[3066,4904,4284],{"class":3086},[3066,4906,4711],{"class":4287},[3066,4908,4316],{"class":4261},[3066,4910,4911,4913,4915,4917,4919,4922],{"class":3068,"line":3118},[3066,4912,4488],{"class":4261},[3066,4914,3608],{"class":4265},[3066,4916,4386],{"class":4280},[3066,4918,4284],{"class":3086},[3066,4920,4921],{"class":4287},"\"Кнопка з успадкованим шрифтом\"",[3066,4923,4316],{"class":4261},[3066,4925,4926,4928,4930],{"class":3068,"line":3124},[3066,4927,4352],{"class":4261},[3066,4929,4367],{"class":4265},[3066,4931,4269],{"class":4261},[3752,4933,4934,4937,4938,4940,4941,4943],{},[2981,4935,4936],{},"Оптимізація пам'яті:"," Inheritance дозволяє не зберігати ",[2969,4939,3215],{}," у кожному ",[2969,4942,4091],{}," окремо. Якщо значення не задане локально — WPF піднімається по дереву до батька, потім до батька батька, і так далі, поки не знайде значення або не досягне кореня.",[3039,4945],{},[2960,4947,4949],{"id":4948},"як-це-працює-під-капотом","Як це працює під капотом?",[2965,4951,4952],{},"Розберемо внутрішню реалізацію Dependency Property System (спрощено).",[3049,4954,4956],{"id":4955},"сховище-значень-effectivevalueentry","Сховище значень: EffectiveValueEntry",[2965,4958,4959,4960,4963,4964,4966],{},"Кожен ",[2969,4961,4962],{},"DependencyObject"," (базовий клас для всіх UI-елементів) містить масив ",[2969,4965,3404],{},":",[3057,4968,4970],{"className":3059,"code":4969,"language":3061,"meta":3062,"style":3062},"public class DependencyObject\n{\n    // Спрощена версія\n    private EffectiveValueEntry[] _effectiveValues;\n    \n    public object GetValue(DependencyProperty dp)\n    {\n        // 1. Знайти entry для цієї властивості\n        int index = dp.GlobalIndex;\n        EffectiveValueEntry entry = _effectiveValues[index];\n        \n        // 2. Якщо є локальне значення — повернути його\n        if (entry.HasLocalValue)\n            return entry.LocalValue;\n        \n        // 3. Якщо є Style Setter — повернути його\n        if (entry.HasStyleValue)\n            return entry.StyleValue;\n        \n        // 4. Перевірити Inheritance\n        if (dp.IsInherited)\n        {\n            DependencyObject parent = GetParent();\n            if (parent != null)\n                return parent.GetValue(dp);\n        }\n        \n        // 5. Повернути Default Value\n        return dp.DefaultMetadata.DefaultValue;\n    }\n}\n",[2969,4971,4972,4981,4985,4990,5005,5009,5030,5034,5039,5059,5080,5085,5090,5108,5122,5126,5131,5146,5159,5163,5168,5183,5188,5204,5222,5240,5246,5251,5257,5277,5282],{"__ignoreMap":3062},[3066,4973,4974,4976,4978],{"class":3068,"line":3069},[3066,4975,3073],{"class":3072},[3066,4977,3076],{"class":3072},[3066,4979,4980],{"class":3079}," DependencyObject\n",[3066,4982,4983],{"class":3068,"line":3083},[3066,4984,3087],{"class":3086},[3066,4986,4987],{"class":3068,"line":3090},[3066,4988,4989],{"class":3241},"    // Спрощена версія\n",[3066,4991,4992,4994,4997,5000,5003],{"class":3068,"line":3118},[3066,4993,3093],{"class":3072},[3066,4995,4996],{"class":3079}," EffectiveValueEntry",[3066,4998,4999],{"class":3086},"[] ",[3066,5001,5002],{"class":3099},"_effectiveValues",[3066,5004,3115],{"class":3086},[3066,5006,5007],{"class":3068,"line":3124},[3066,5008,3121],{"class":3086},[3066,5010,5011,5013,5016,5019,5021,5024,5027],{"class":3068,"line":3135},[3066,5012,3127],{"class":3072},[3066,5014,5015],{"class":3072}," object",[3066,5017,5018],{"class":3550}," GetValue",[3066,5020,3585],{"class":3086},[3066,5022,5023],{"class":3079},"DependencyProperty",[3066,5025,5026],{"class":3099}," dp",[3066,5028,5029],{"class":3086},")\n",[3066,5031,5032],{"class":3068,"line":3141},[3066,5033,3138],{"class":3086},[3066,5035,5036],{"class":3068,"line":3155},[3066,5037,5038],{"class":3241},"        // 1. Знайти entry для цієї властивості\n",[3066,5040,5041,5044,5047,5049,5052,5054,5057],{"class":3068,"line":3172},[3066,5042,5043],{"class":3072},"        int",[3066,5045,5046],{"class":3099}," index",[3066,5048,3103],{"class":3086},[3066,5050,5051],{"class":3099},"dp",[3066,5053,3109],{"class":3086},[3066,5055,5056],{"class":3099},"GlobalIndex",[3066,5058,3115],{"class":3086},[3066,5060,5061,5064,5067,5069,5071,5074,5077],{"class":3068,"line":3178},[3066,5062,5063],{"class":3079},"        EffectiveValueEntry",[3066,5065,5066],{"class":3099}," entry",[3066,5068,3103],{"class":3086},[3066,5070,5002],{"class":3099},[3066,5072,5073],{"class":3086},"[",[3066,5075,5076],{"class":3099},"index",[3066,5078,5079],{"class":3086},"];\n",[3066,5081,5082],{"class":3068,"line":3332},[3066,5083,5084],{"class":3086},"        \n",[3066,5086,5087],{"class":3068,"line":3663},[3066,5088,5089],{"class":3241},"        // 2. Якщо є локальне значення — повернути його\n",[3066,5091,5092,5096,5098,5101,5103,5106],{"class":3068,"line":3669},[3066,5093,5095],{"class":5094},"sCDza","        if",[3066,5097,3013],{"class":3086},[3066,5099,5100],{"class":3099},"entry",[3066,5102,3109],{"class":3086},[3066,5104,5105],{"class":3099},"HasLocalValue",[3066,5107,5029],{"class":3086},[3066,5109,5110,5113,5115,5117,5120],{"class":3068,"line":3675},[3066,5111,5112],{"class":5094},"            return",[3066,5114,5066],{"class":3099},[3066,5116,3109],{"class":3086},[3066,5118,5119],{"class":3099},"LocalValue",[3066,5121,3115],{"class":3086},[3066,5123,5124],{"class":3068,"line":3680},[3066,5125,5084],{"class":3086},[3066,5127,5128],{"class":3068,"line":3686},[3066,5129,5130],{"class":3241},"        // 3. Якщо є Style Setter — повернути його\n",[3066,5132,5133,5135,5137,5139,5141,5144],{"class":3068,"line":3695},[3066,5134,5095],{"class":5094},[3066,5136,3013],{"class":3086},[3066,5138,5100],{"class":3099},[3066,5140,3109],{"class":3086},[3066,5142,5143],{"class":3099},"HasStyleValue",[3066,5145,5029],{"class":3086},[3066,5147,5148,5150,5152,5154,5157],{"class":3068,"line":3700},[3066,5149,5112],{"class":5094},[3066,5151,5066],{"class":3099},[3066,5153,3109],{"class":3086},[3066,5155,5156],{"class":3099},"StyleValue",[3066,5158,3115],{"class":3086},[3066,5160,5161],{"class":3068,"line":3723},[3066,5162,5084],{"class":3086},[3066,5164,5165],{"class":3068,"line":3743},[3066,5166,5167],{"class":3241},"        // 4. Перевірити Inheritance\n",[3066,5169,5170,5172,5174,5176,5178,5181],{"class":3068,"line":3748},[3066,5171,5095],{"class":5094},[3066,5173,3013],{"class":3086},[3066,5175,5051],{"class":3099},[3066,5177,3109],{"class":3086},[3066,5179,5180],{"class":3099},"IsInherited",[3066,5182,5029],{"class":3086},[3066,5184,5185],{"class":3068,"line":4227},[3066,5186,5187],{"class":3086},"        {\n",[3066,5189,5190,5193,5196,5198,5201],{"class":3068,"line":4233},[3066,5191,5192],{"class":3079},"            DependencyObject",[3066,5194,5195],{"class":3099}," parent",[3066,5197,3103],{"class":3086},[3066,5199,5200],{"class":3550},"GetParent",[3066,5202,5203],{"class":3086},"();\n",[3066,5205,5207,5210,5212,5215,5218,5220],{"class":3068,"line":5206},24,[3066,5208,5209],{"class":5094},"            if",[3066,5211,3013],{"class":3086},[3066,5213,5214],{"class":3099},"parent",[3066,5216,5217],{"class":3086}," != ",[3066,5219,3639],{"class":3072},[3066,5221,5029],{"class":3086},[3066,5223,5225,5228,5230,5232,5234,5236,5238],{"class":3068,"line":5224},25,[3066,5226,5227],{"class":5094},"                return",[3066,5229,5195],{"class":3099},[3066,5231,3109],{"class":3086},[3066,5233,3712],{"class":3550},[3066,5235,3585],{"class":3086},[3066,5237,5051],{"class":3099},[3066,5239,3720],{"class":3086},[3066,5241,5243],{"class":3068,"line":5242},26,[3066,5244,5245],{"class":3086},"        }\n",[3066,5247,5249],{"class":3068,"line":5248},27,[3066,5250,5084],{"class":3086},[3066,5252,5254],{"class":3068,"line":5253},28,[3066,5255,5256],{"class":3241},"        // 5. Повернути Default Value\n",[3066,5258,5260,5263,5265,5267,5270,5272,5275],{"class":3068,"line":5259},29,[3066,5261,5262],{"class":5094},"        return",[3066,5264,5026],{"class":3099},[3066,5266,3109],{"class":3086},[3066,5268,5269],{"class":3099},"DefaultMetadata",[3066,5271,3109],{"class":3086},[3066,5273,5274],{"class":3099},"DefaultValue",[3066,5276,3115],{"class":3086},[3066,5278,5280],{"class":3068,"line":5279},30,[3066,5281,3175],{"class":3086},[3066,5283,5285],{"class":3068,"line":5284},31,[3066,5286,3181],{"class":3086},[3032,5288,5289,5292,5293,3109],{},[2981,5290,5291],{},"Реальна реалізація"," значно складніша — вона враховує анімації, coercion, validation, thread-safety та багато інших аспектів. Але основна ідея залишається тією ж: ",[2981,5294,5295],{},"централізоване сховище + система пріоритетів",[3049,5297,5299],{"id":5298},"чому-це-ефективно","Чому це ефективно?",[3186,5301,5302,5310,5316],{},[3189,5303,5306,5307,5309],{"icon":5304,"title":5305},"i-lucide-hard-drive","🚀 Економія пам'яті","Якщо властивість має значення за замовчуванням — вона не займає місця у ",[2969,5308,5002],{},". Масив розширюється динамічно лише для властивостей з non-default значеннями.",[3189,5311,5313,5315],{"icon":92,"title":5312},"⚡ Швидкий доступ",[2969,5314,5056],{}," дозволяє отримати значення за O(1) — прямий доступ до масиву без хешування чи пошуку.",[3189,5317,5320,5321,5324],{"icon":5318,"title":5319},"i-lucide-refresh-cw","🔄 Автоматична інвалідація","Коли значення змінюється — WPF автоматично повідомляє Binding Engine, Layout System та Rendering Engine. Не потрібно ручних ",[2969,5322,5323],{},"PropertyChanged"," подій.",[3039,5326],{},[2960,5328,5330],{"id":5329},"метадані-dependency-property","Метадані Dependency Property",[2965,5332,5333,5334,3013,5336,5339],{},"Кожна Dependency Property має ",[2981,5335,3410],{},[2969,5337,5338],{},"PropertyMetadata","), що визначають її поведінку.",[3049,5341,5343],{"id":5342},"frameworkpropertymetadata","FrameworkPropertyMetadata",[2965,5345,5346,5347,5349],{},"Найчастіше використовується ",[2969,5348,5343],{}," — розширена версія з прапорцями для WPF:",[3057,5351,5353],{"className":3059,"code":5352,"language":3061,"meta":3062,"style":3062},"public static readonly DependencyProperty MyProperty =\n    DependencyProperty.Register(\n        \"MyProperty\",\n        typeof(string),\n        typeof(MyControl),\n        new FrameworkPropertyMetadata(\n            defaultValue: \"Default\",\n            flags: FrameworkPropertyMetadataOptions.AffectsRender |\n                   FrameworkPropertyMetadataOptions.AffectsMeasure,\n            propertyChangedCallback: OnMyPropertyChanged\n        )\n    );\n\nprivate static void OnMyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\n{\n    var control = (MyControl)d;\n    // Реакція на зміну значення\n    Console.WriteLine($\"MyProperty змінилася: {e.OldValue} → {e.NewValue}\");\n}\n",[2969,5354,5355,5370,5381,5389,5402,5413,5422,5434,5451,5463,5473,5478,5483,5487,5517,5521,5541,5546,5595],{"__ignoreMap":3062},[3066,5356,5357,5359,5361,5363,5365,5368],{"class":3068,"line":3069},[3066,5358,3073],{"class":3072},[3066,5360,3528],{"class":3072},[3066,5362,3531],{"class":3072},[3066,5364,3534],{"class":3079},[3066,5366,5367],{"class":3099}," MyProperty",[3066,5369,3540],{"class":3086},[3066,5371,5372,5375,5377,5379],{"class":3068,"line":3083},[3066,5373,5374],{"class":3099},"    DependencyProperty",[3066,5376,3109],{"class":3086},[3066,5378,3551],{"class":3550},[3066,5380,3554],{"class":3086},[3066,5382,5383,5386],{"class":3068,"line":3090},[3066,5384,5385],{"class":3565},"        \"MyProperty\"",[3066,5387,5388],{"class":3086},",\n",[3066,5390,5391,5394,5396,5399],{"class":3068,"line":3118},[3066,5392,5393],{"class":3072},"        typeof",[3066,5395,3585],{"class":3086},[3066,5397,5398],{"class":3072},"string",[3066,5400,5401],{"class":3086},"),\n",[3066,5403,5404,5406,5408,5411],{"class":3068,"line":3124},[3066,5405,5393],{"class":3072},[3066,5407,3585],{"class":3086},[3066,5409,5410],{"class":3079},"MyControl",[3066,5412,5401],{"class":3086},[3066,5414,5415,5418,5420],{"class":3068,"line":3135},[3066,5416,5417],{"class":3072},"        new",[3066,5419,3627],{"class":3079},[3066,5421,3554],{"class":3086},[3066,5423,5424,5427,5429,5432],{"class":3068,"line":3141},[3066,5425,5426],{"class":3099},"            defaultValue",[3066,5428,3562],{"class":3086},[3066,5430,5431],{"class":3565},"\"Default\"",[3066,5433,5388],{"class":3086},[3066,5435,5436,5439,5441,5443,5445,5448],{"class":3068,"line":3155},[3066,5437,5438],{"class":3099},"            flags",[3066,5440,3562],{"class":3086},[3066,5442,3655],{"class":3099},[3066,5444,3109],{"class":3086},[3066,5446,5447],{"class":3099},"AffectsRender",[3066,5449,5450],{"class":3086}," |\n",[3066,5452,5453,5456,5458,5461],{"class":3068,"line":3172},[3066,5454,5455],{"class":3099},"                   FrameworkPropertyMetadataOptions",[3066,5457,3109],{"class":3086},[3066,5459,5460],{"class":3099},"AffectsMeasure",[3066,5462,5388],{"class":3086},[3066,5464,5465,5468,5470],{"class":3068,"line":3178},[3066,5466,5467],{"class":3099},"            propertyChangedCallback",[3066,5469,3562],{"class":3086},[3066,5471,5472],{"class":3099},"OnMyPropertyChanged\n",[3066,5474,5475],{"class":3068,"line":3332},[3066,5476,5477],{"class":3086},"        )\n",[3066,5479,5480],{"class":3068,"line":3663},[3066,5481,5482],{"class":3086},"    );\n",[3066,5484,5485],{"class":3068,"line":3669},[3066,5486,3808],{"emptyLinePlaceholder":3807},[3066,5488,5489,5492,5494,5497,5500,5502,5504,5507,5509,5512,5515],{"class":3068,"line":3675},[3066,5490,5491],{"class":3072},"private",[3066,5493,3528],{"class":3072},[3066,5495,5496],{"class":3072}," void",[3066,5498,5499],{"class":3550}," OnMyPropertyChanged",[3066,5501,3585],{"class":3086},[3066,5503,4962],{"class":3079},[3066,5505,5506],{"class":3099}," d",[3066,5508,3432],{"class":3086},[3066,5510,5511],{"class":3079},"DependencyPropertyChangedEventArgs",[3066,5513,5514],{"class":3099}," e",[3066,5516,5029],{"class":3086},[3066,5518,5519],{"class":3068,"line":3680},[3066,5520,3087],{"class":3086},[3066,5522,5523,5526,5529,5532,5534,5536,5539],{"class":3068,"line":3686},[3066,5524,5525],{"class":3072},"    var",[3066,5527,5528],{"class":3099}," control",[3066,5530,5531],{"class":3086}," = (",[3066,5533,5410],{"class":3079},[3066,5535,3000],{"class":3086},[3066,5537,5538],{"class":3099},"d",[3066,5540,3115],{"class":3086},[3066,5542,5543],{"class":3068,"line":3695},[3066,5544,5545],{"class":3241},"    // Реакція на зміну значення\n",[3066,5547,5548,5551,5553,5556,5558,5561,5565,5568,5570,5573,5576,5579,5581,5583,5585,5588,5590,5593],{"class":3068,"line":3700},[3066,5549,5550],{"class":3099},"    Console",[3066,5552,3109],{"class":3086},[3066,5554,5555],{"class":3550},"WriteLine",[3066,5557,3585],{"class":3086},[3066,5559,5560],{"class":3565},"$\"MyProperty змінилася: ",[3066,5562,5564],{"class":5563},"sD7JJ","{",[3066,5566,5567],{"class":3099},"e",[3066,5569,3109],{"class":5563},[3066,5571,5572],{"class":3099},"OldValue",[3066,5574,5575],{"class":5563},"}",[3066,5577,5578],{"class":3565}," → ",[3066,5580,5564],{"class":5563},[3066,5582,5567],{"class":3099},[3066,5584,3109],{"class":5563},[3066,5586,5587],{"class":3099},"NewValue",[3066,5589,5575],{"class":5563},[3066,5591,5592],{"class":3565},"\"",[3066,5594,3720],{"class":3086},[3066,5596,5597],{"class":3068,"line":3723},[3066,5598,3181],{"class":3086},[3049,5600,5602],{"id":5601},"прапорці-метаданих","Прапорці метаданих",[3930,5604,5605,5614],{},[3933,5606,5607],{},[3936,5608,5609,5612],{},[3939,5610,5611],{},"Прапорець",[3939,5613,3947],{},[3952,5615,5616,5625,5634,5644,5654,5671,5681],{},[3936,5617,5618,5622],{},[3957,5619,5620],{},[2969,5621,5447],{},[3957,5623,5624],{},"Зміна властивості вимагає перемалювання (re-render)",[3936,5626,5627,5631],{},[3957,5628,5629],{},[2969,5630,5460],{},[3957,5632,5633],{},"Зміна властивості вимагає перерахунку розмірів (measure pass)",[3936,5635,5636,5641],{},[3957,5637,5638],{},[2969,5639,5640],{},"AffectsArrange",[3957,5642,5643],{},"Зміна властивості вимагає перерахунку позиції (arrange pass)",[3936,5645,5646,5651],{},[3957,5647,5648],{},[2969,5649,5650],{},"AffectsParentMeasure",[3957,5652,5653],{},"Зміна властивості вимагає перерахунку розмірів батьківського елемента",[3936,5655,5656,5661],{},[3957,5657,5658],{},[2969,5659,5660],{},"BindsTwoWayByDefault",[3957,5662,5663,5664,5667,5668,3000],{},"Binding за замовчуванням має режим ",[2969,5665,5666],{},"TwoWay"," (наприклад, ",[2969,5669,5670],{},"TextBox.Text",[3936,5672,5673,5678],{},[3957,5674,5675],{},[2969,5676,5677],{},"Inherits",[3957,5679,5680],{},"Властивість підтримує Property Value Inheritance",[3936,5682,5683,5688],{},[3957,5684,5685],{},[2969,5686,5687],{},"Journal",[3957,5689,5690],{},"Значення зберігається в історії навігації",[3370,5692,5693,5696,5697,5699],{},[2981,5694,5695],{},"Performance tip:"," Не використовуйте ",[2969,5698,5460],{}," без необхідності. Measure pass — дорога операція, що може викликати каскадний перерахунок всього Layout Tree.",[3039,5701],{},[2960,5703,5705],{"id":5704},"практичні-завдання","Практичні завдання",[2965,5707,5708],{},"Закріпимо знання через практику.",[3049,5710,5712],{"id":5711},"рівень-1-дослідження-value-precedence","Рівень 1: Дослідження Value Precedence",[2965,5714,5715,5718],{},[2981,5716,5717],{},"Завдання:"," Створіть WPF-застосунок, що демонструє конфлікт між Style та Local Value.",[5720,5721,5722,5726,5811,5815,5914,5918],"steps",{},[3049,5723,5725],{"id":5724},"крок-1-створіть-стиль-для-кнопок","Крок 1: Створіть стиль для кнопок",[3057,5727,5729],{"className":4252,"code":5728,"language":4254,"meta":3062,"style":3062},"\u003CWindow.Resources>\n    \u003CStyle TargetType=\"Button\">\n        \u003CSetter Property=\"Background\" Value=\"LightBlue\"/>\n        \u003CSetter Property=\"Padding\" Value=\"10\"/>\n    \u003C/Style>\n\u003C/Window.Resources>\n",[2969,5730,5731,5739,5753,5774,5795,5803],{"__ignoreMap":3062},[3066,5732,5733,5735,5737],{"class":3068,"line":3069},[3066,5734,4262],{"class":4261},[3066,5736,4266],{"class":4265},[3066,5738,4269],{"class":4261},[3066,5740,5741,5743,5745,5747,5749,5751],{"class":3068,"line":3083},[3066,5742,4274],{"class":4261},[3066,5744,4277],{"class":4265},[3066,5746,4281],{"class":4280},[3066,5748,4284],{"class":3086},[3066,5750,4288],{"class":4287},[3066,5752,4269],{"class":4261},[3066,5754,5755,5757,5759,5761,5763,5765,5767,5769,5772],{"class":3068,"line":3090},[3066,5756,4295],{"class":4261},[3066,5758,4298],{"class":4265},[3066,5760,4301],{"class":4280},[3066,5762,4284],{"class":3086},[3066,5764,3566],{"class":4287},[3066,5766,4308],{"class":4280},[3066,5768,4284],{"class":3086},[3066,5770,5771],{"class":4287},"\"LightBlue\"",[3066,5773,4316],{"class":4261},[3066,5775,5776,5778,5780,5782,5784,5787,5789,5791,5793],{"class":3068,"line":3118},[3066,5777,4295],{"class":4261},[3066,5779,4298],{"class":4265},[3066,5781,4301],{"class":4280},[3066,5783,4284],{"class":3086},[3066,5785,5786],{"class":4287},"\"Padding\"",[3066,5788,4308],{"class":4280},[3066,5790,4284],{"class":3086},[3066,5792,4481],{"class":4287},[3066,5794,4316],{"class":4261},[3066,5796,5797,5799,5801],{"class":3068,"line":3124},[3066,5798,4343],{"class":4261},[3066,5800,4277],{"class":4265},[3066,5802,4269],{"class":4261},[3066,5804,5805,5807,5809],{"class":3068,"line":3135},[3066,5806,4352],{"class":4261},[3066,5808,4266],{"class":4265},[3066,5810,4269],{"class":4261},[3049,5812,5814],{"id":5813},"крок-2-додайте-кнопки-з-різними-значеннями","Крок 2: Додайте кнопки з різними значеннями",[3057,5816,5818],{"className":4252,"code":5817,"language":4254,"meta":3062,"style":3062},"\u003CStackPanel Margin=\"20\">\n    \u003CButton Content=\"Кнопка зі стилем\" Margin=\"0,0,0,10\"/>\n    \u003CButton Content=\"Кнопка з локальним значенням\" Background=\"Red\" Margin=\"0,0,0,10\"/>\n    \u003CButton x:Name=\"DynamicButton\" Content=\"Кнопка для експериментів\"/>\n\u003C/StackPanel>\n",[2969,5819,5820,5834,5856,5883,5906],{"__ignoreMap":3062},[3066,5821,5822,5824,5826,5828,5830,5832],{"class":3068,"line":3069},[3066,5823,4262],{"class":4261},[3066,5825,4367],{"class":4265},[3066,5827,4370],{"class":4280},[3066,5829,4284],{"class":3086},[3066,5831,4375],{"class":4287},[3066,5833,4269],{"class":4261},[3066,5835,5836,5838,5840,5842,5844,5847,5849,5851,5854],{"class":3068,"line":3083},[3066,5837,4274],{"class":4261},[3066,5839,3608],{"class":4265},[3066,5841,4386],{"class":4280},[3066,5843,4284],{"class":3086},[3066,5845,5846],{"class":4287},"\"Кнопка зі стилем\"",[3066,5848,4370],{"class":4280},[3066,5850,4284],{"class":3086},[3066,5852,5853],{"class":4287},"\"0,0,0,10\"",[3066,5855,4316],{"class":4261},[3066,5857,5858,5860,5862,5864,5866,5869,5871,5873,5875,5877,5879,5881],{"class":3068,"line":3090},[3066,5859,4274],{"class":4261},[3066,5861,3608],{"class":4265},[3066,5863,4386],{"class":4280},[3066,5865,4284],{"class":3086},[3066,5867,5868],{"class":4287},"\"Кнопка з локальним значенням\"",[3066,5870,4409],{"class":4280},[3066,5872,4284],{"class":3086},[3066,5874,4414],{"class":4287},[3066,5876,4370],{"class":4280},[3066,5878,4284],{"class":3086},[3066,5880,5853],{"class":4287},[3066,5882,4316],{"class":4261},[3066,5884,5885,5887,5889,5892,5894,5897,5899,5901,5904],{"class":3068,"line":3118},[3066,5886,4274],{"class":4261},[3066,5888,3608],{"class":4265},[3066,5890,5891],{"class":4280}," x:Name",[3066,5893,4284],{"class":3086},[3066,5895,5896],{"class":4287},"\"DynamicButton\"",[3066,5898,4386],{"class":4280},[3066,5900,4284],{"class":3086},[3066,5902,5903],{"class":4287},"\"Кнопка для експериментів\"",[3066,5905,4316],{"class":4261},[3066,5907,5908,5910,5912],{"class":3068,"line":3124},[3066,5909,4352],{"class":4261},[3066,5911,4367],{"class":4265},[3066,5913,4269],{"class":4261},[3049,5915,5917],{"id":5916},"крок-3-експериментуйте-з-clearvalue","Крок 3: Експериментуйте з ClearValue()",[3057,5919,5921],{"className":3059,"code":5920,"language":3061,"meta":3062,"style":3062},"// У code-behind\nprivate void Window_Loaded(object sender, RoutedEventArgs e)\n{\n    // Встановлюємо локальне значення\n    DynamicButton.Background = Brushes.Green;\n    \n    // Через 2 секунди скидаємо його\n    Task.Delay(2000).ContinueWith(_ =>\n    {\n        Dispatcher.Invoke(() =>\n        {\n            DynamicButton.ClearValue(Button.BackgroundProperty);\n        });\n    });\n}\n",[2969,5922,5923,5928,5954,5958,5963,5983,5987,5992,6022,6026,6039,6043,6062,6067,6072],{"__ignoreMap":3062},[3066,5924,5925],{"class":3068,"line":3069},[3066,5926,5927],{"class":3241},"// У code-behind\n",[3066,5929,5930,5932,5934,5937,5939,5942,5945,5947,5950,5952],{"class":3068,"line":3083},[3066,5931,5491],{"class":3072},[3066,5933,5496],{"class":3072},[3066,5935,5936],{"class":3550}," Window_Loaded",[3066,5938,3585],{"class":3086},[3066,5940,5941],{"class":3072},"object",[3066,5943,5944],{"class":3099}," sender",[3066,5946,3432],{"class":3086},[3066,5948,5949],{"class":3079},"RoutedEventArgs",[3066,5951,5514],{"class":3099},[3066,5953,5029],{"class":3086},[3066,5955,5956],{"class":3068,"line":3090},[3066,5957,3087],{"class":3086},[3066,5959,5960],{"class":3068,"line":3118},[3066,5961,5962],{"class":3241},"    // Встановлюємо локальне значення\n",[3066,5964,5965,5968,5970,5972,5974,5976,5978,5981],{"class":3068,"line":3124},[3066,5966,5967],{"class":3099},"    DynamicButton",[3066,5969,3109],{"class":3086},[3066,5971,2971],{"class":3099},[3066,5973,3103],{"class":3086},[3066,5975,3106],{"class":3099},[3066,5977,3109],{"class":3086},[3066,5979,5980],{"class":3099},"Green",[3066,5982,3115],{"class":3086},[3066,5984,5985],{"class":3068,"line":3135},[3066,5986,3121],{"class":3086},[3066,5988,5989],{"class":3068,"line":3141},[3066,5990,5991],{"class":3241},"    // Через 2 секунди скидаємо його\n",[3066,5993,5994,5997,5999,6002,6004,6008,6011,6014,6016,6019],{"class":3068,"line":3155},[3066,5995,5996],{"class":3099},"    Task",[3066,5998,3109],{"class":3086},[3066,6000,6001],{"class":3550},"Delay",[3066,6003,3585],{"class":3086},[3066,6005,6007],{"class":6006},"sJj4R","2000",[3066,6009,6010],{"class":3086},").",[3066,6012,6013],{"class":3550},"ContinueWith",[3066,6015,3585],{"class":3086},[3066,6017,6018],{"class":3099},"_",[3066,6020,6021],{"class":3086}," =>\n",[3066,6023,6024],{"class":3068,"line":3172},[3066,6025,3138],{"class":3086},[3066,6027,6028,6031,6033,6036],{"class":3068,"line":3178},[3066,6029,6030],{"class":3099},"        Dispatcher",[3066,6032,3109],{"class":3086},[3066,6034,6035],{"class":3550},"Invoke",[3066,6037,6038],{"class":3086},"(() =>\n",[3066,6040,6041],{"class":3068,"line":3332},[3066,6042,5187],{"class":3086},[3066,6044,6045,6048,6050,6052,6054,6056,6058,6060],{"class":3068,"line":3663},[3066,6046,6047],{"class":3099},"            DynamicButton",[3066,6049,3109],{"class":3086},[3066,6051,4596],{"class":3550},[3066,6053,3585],{"class":3086},[3066,6055,3608],{"class":3099},[3066,6057,3109],{"class":3086},[3066,6059,3717],{"class":3099},[3066,6061,3720],{"class":3086},[3066,6063,6064],{"class":3068,"line":3669},[3066,6065,6066],{"class":3086},"        });\n",[3066,6068,6069],{"class":3068,"line":3675},[3066,6070,6071],{"class":3086},"    });\n",[3066,6073,6074],{"class":3068,"line":3680},[3066,6075,3181],{"class":3086},[2965,6077,6078,6081],{},[2981,6079,6080],{},"Очікуваний результат:"," Кнопка спочатку зелена, потім стає світло-синьою (повертається до стилю).",[3039,6083],{},[3049,6085,6087],{"id":6086},"рівень-2-дослідження-inheritance","Рівень 2: Дослідження Inheritance",[2965,6089,6090,6092],{},[2981,6091,5717],{}," Визначте, які властивості підтримують Property Value Inheritance.",[5720,6094,6095,6099,6299,6303,6306,6330,6334],{},[3049,6096,6098],{"id":6097},"крок-1-створіть-тестове-вікно","Крок 1: Створіть тестове вікно",[3057,6100,6102],{"className":4252,"code":6101,"language":4254,"meta":3062,"style":3062},"\u003CWindow x:Class=\"InheritanceTest.MainWindow\"\n        FontSize=\"20\"\n        FontFamily=\"Arial\"\n        Foreground=\"DarkGreen\"\n        Background=\"LightYellow\">\n    \u003CStackPanel Margin=\"20\">\n        \u003CTextBlock Text=\"Текст 1\"/>\n        \u003CTextBlock Text=\"Текст 2\" FontSize=\"14\"/>\n        \u003CButton Content=\"Кнопка\"/>\n        \u003CBorder BorderBrush=\"Black\" BorderThickness=\"1\" Padding=\"10\">\n            \u003CTextBlock Text=\"Текст у Border\"/>\n        \u003C/Border>\n    \u003C/StackPanel>\n\u003C/Window>\n",[2969,6103,6104,6118,6128,6138,6148,6160,6174,6189,6211,6226,6258,6274,6283,6291],{"__ignoreMap":3062},[3066,6105,6106,6108,6110,6113,6115],{"class":3068,"line":3069},[3066,6107,4262],{"class":4261},[3066,6109,3219],{"class":4265},[3066,6111,6112],{"class":4280}," x:Class",[3066,6114,4284],{"class":3086},[3066,6116,6117],{"class":4287},"\"InheritanceTest.MainWindow\"\n",[3066,6119,6120,6123,6125],{"class":3068,"line":3083},[3066,6121,6122],{"class":4280},"        FontSize",[3066,6124,4284],{"class":3086},[3066,6126,6127],{"class":4287},"\"20\"\n",[3066,6129,6130,6133,6135],{"class":3068,"line":3090},[3066,6131,6132],{"class":4280},"        FontFamily",[3066,6134,4284],{"class":3086},[3066,6136,6137],{"class":4287},"\"Arial\"\n",[3066,6139,6140,6143,6145],{"class":3068,"line":3118},[3066,6141,6142],{"class":4280},"        Foreground",[3066,6144,4284],{"class":3086},[3066,6146,6147],{"class":4287},"\"DarkGreen\"\n",[3066,6149,6150,6153,6155,6158],{"class":3068,"line":3124},[3066,6151,6152],{"class":4280},"        Background",[3066,6154,4284],{"class":3086},[3066,6156,6157],{"class":4287},"\"LightYellow\"",[3066,6159,4269],{"class":4261},[3066,6161,6162,6164,6166,6168,6170,6172],{"class":3068,"line":3135},[3066,6163,4274],{"class":4261},[3066,6165,4367],{"class":4265},[3066,6167,4370],{"class":4280},[3066,6169,4284],{"class":3086},[3066,6171,4375],{"class":4287},[3066,6173,4269],{"class":4261},[3066,6175,6176,6178,6180,6182,6184,6187],{"class":3068,"line":3141},[3066,6177,4295],{"class":4261},[3066,6179,4091],{"class":4265},[3066,6181,4683],{"class":4280},[3066,6183,4284],{"class":3086},[3066,6185,6186],{"class":4287},"\"Текст 1\"",[3066,6188,4316],{"class":4261},[3066,6190,6191,6193,6195,6197,6199,6202,6204,6206,6209],{"class":3068,"line":3155},[3066,6192,4295],{"class":4261},[3066,6194,4091],{"class":4265},[3066,6196,4683],{"class":4280},[3066,6198,4284],{"class":3086},[3066,6200,6201],{"class":4287},"\"Текст 2\"",[3066,6203,4651],{"class":4280},[3066,6205,4284],{"class":3086},[3066,6207,6208],{"class":4287},"\"14\"",[3066,6210,4316],{"class":4261},[3066,6212,6213,6215,6217,6219,6221,6224],{"class":3068,"line":3172},[3066,6214,4295],{"class":4261},[3066,6216,3608],{"class":4265},[3066,6218,4386],{"class":4280},[3066,6220,4284],{"class":3086},[3066,6222,6223],{"class":4287},"\"Кнопка\"",[3066,6225,4316],{"class":4261},[3066,6227,6228,6230,6233,6236,6238,6241,6244,6246,6249,6252,6254,6256],{"class":3068,"line":3178},[3066,6229,4295],{"class":4261},[3066,6231,6232],{"class":4265},"Border",[3066,6234,6235],{"class":4280}," BorderBrush",[3066,6237,4284],{"class":3086},[3066,6239,6240],{"class":4287},"\"Black\"",[3066,6242,6243],{"class":4280}," BorderThickness",[3066,6245,4284],{"class":3086},[3066,6247,6248],{"class":4287},"\"1\"",[3066,6250,6251],{"class":4280}," Padding",[3066,6253,4284],{"class":3086},[3066,6255,4481],{"class":4287},[3066,6257,4269],{"class":4261},[3066,6259,6260,6263,6265,6267,6269,6272],{"class":3068,"line":3332},[3066,6261,6262],{"class":4261},"            \u003C",[3066,6264,4091],{"class":4265},[3066,6266,4683],{"class":4280},[3066,6268,4284],{"class":3086},[3066,6270,6271],{"class":4287},"\"Текст у Border\"",[3066,6273,4316],{"class":4261},[3066,6275,6276,6279,6281],{"class":3068,"line":3663},[3066,6277,6278],{"class":4261},"        \u003C/",[3066,6280,6232],{"class":4265},[3066,6282,4269],{"class":4261},[3066,6284,6285,6287,6289],{"class":3068,"line":3669},[3066,6286,4343],{"class":4261},[3066,6288,4367],{"class":4265},[3066,6290,4269],{"class":4261},[3066,6292,6293,6295,6297],{"class":3068,"line":3675},[3066,6294,4352],{"class":4261},[3066,6296,3219],{"class":4265},[3066,6298,4269],{"class":4261},[3049,6300,6302],{"id":6301},"крок-2-запустіть-та-проаналізуйте","Крок 2: Запустіть та проаналізуйте",[2965,6304,6305],{},"Відповідайте на питання:",[2974,6307,6308,6317,6323],{},[2977,6309,6310,6311,6313,6314,6316],{},"Чи успадковується ",[2969,6312,3215],{}," у ",[2969,6315,4091],{},"?",[2977,6318,6310,6319,6313,6321,6316],{},[2969,6320,2971],{},[2969,6322,4367],{},[2977,6324,6310,6325,6313,6327,6316],{},[2969,6326,4797],{},[2969,6328,6329],{},"Button.Content",[3049,6331,6333],{"id":6332},"крок-3-перевірте-через-код","Крок 3: Перевірте через код",[3057,6335,6337],{"className":3059,"code":6336,"language":3061,"meta":3062,"style":3062},"private void Window_Loaded(object sender, RoutedEventArgs e)\n{\n    var textBlock = (TextBlock)((StackPanel)Content).Children[0];\n    \n    // Отримуємо джерело значення\n    var valueSource = DependencyPropertyHelper.GetValueSource(textBlock, TextBlock.FontSizeProperty);\n    \n    Console.WriteLine($\"FontSize джерело: {valueSource.BaseValueSource}\");\n    // Очікуваний вивід: Inherited\n}\n",[2969,6338,6339,6361,6365,6398,6402,6407,6440,6444,6473,6478],{"__ignoreMap":3062},[3066,6340,6341,6343,6345,6347,6349,6351,6353,6355,6357,6359],{"class":3068,"line":3069},[3066,6342,5491],{"class":3072},[3066,6344,5496],{"class":3072},[3066,6346,5936],{"class":3550},[3066,6348,3585],{"class":3086},[3066,6350,5941],{"class":3072},[3066,6352,5944],{"class":3099},[3066,6354,3432],{"class":3086},[3066,6356,5949],{"class":3079},[3066,6358,5514],{"class":3099},[3066,6360,5029],{"class":3086},[3066,6362,6363],{"class":3068,"line":3083},[3066,6364,3087],{"class":3086},[3066,6366,6367,6369,6372,6374,6376,6379,6381,6383,6386,6388,6391,6393,6396],{"class":3068,"line":3090},[3066,6368,5525],{"class":3072},[3066,6370,6371],{"class":3099}," textBlock",[3066,6373,5531],{"class":3086},[3066,6375,4091],{"class":3079},[3066,6377,6378],{"class":3086},")((",[3066,6380,4367],{"class":3079},[3066,6382,3000],{"class":3086},[3066,6384,6385],{"class":3099},"Content",[3066,6387,6010],{"class":3086},[3066,6389,6390],{"class":3099},"Children",[3066,6392,5073],{"class":3086},[3066,6394,6395],{"class":6006},"0",[3066,6397,5079],{"class":3086},[3066,6399,6400],{"class":3068,"line":3118},[3066,6401,3121],{"class":3086},[3066,6403,6404],{"class":3068,"line":3124},[3066,6405,6406],{"class":3241},"    // Отримуємо джерело значення\n",[3066,6408,6409,6411,6414,6416,6419,6421,6424,6426,6429,6431,6433,6435,6438],{"class":3068,"line":3135},[3066,6410,5525],{"class":3072},[3066,6412,6413],{"class":3099}," valueSource",[3066,6415,3103],{"class":3086},[3066,6417,6418],{"class":3099},"DependencyPropertyHelper",[3066,6420,3109],{"class":3086},[3066,6422,6423],{"class":3550},"GetValueSource",[3066,6425,3585],{"class":3086},[3066,6427,6428],{"class":3099},"textBlock",[3066,6430,3432],{"class":3086},[3066,6432,4091],{"class":3099},[3066,6434,3109],{"class":3086},[3066,6436,6437],{"class":3099},"FontSizeProperty",[3066,6439,3720],{"class":3086},[3066,6441,6442],{"class":3068,"line":3141},[3066,6443,3121],{"class":3086},[3066,6445,6446,6448,6450,6452,6454,6457,6459,6462,6464,6467,6469,6471],{"class":3068,"line":3155},[3066,6447,5550],{"class":3099},[3066,6449,3109],{"class":3086},[3066,6451,5555],{"class":3550},[3066,6453,3585],{"class":3086},[3066,6455,6456],{"class":3565},"$\"FontSize джерело: ",[3066,6458,5564],{"class":5563},[3066,6460,6461],{"class":3099},"valueSource",[3066,6463,3109],{"class":5563},[3066,6465,6466],{"class":3099},"BaseValueSource",[3066,6468,5575],{"class":5563},[3066,6470,5592],{"class":3565},[3066,6472,3720],{"class":3086},[3066,6474,6475],{"class":3068,"line":3172},[3066,6476,6477],{"class":3241},"    // Очікуваний вивід: Inherited\n",[3066,6479,6480],{"class":3068,"line":3178},[3066,6481,3181],{"class":3086},[3039,6483],{},[3049,6485,6487],{"id":6486},"рівень-3-візуалізація-пріоритетів","Рівень 3: Візуалізація пріоритетів",[2965,6489,6490,6492],{},[2981,6491,5717],{}," Створіть інтерактивний демонстратор системи пріоритетів.",[2965,6494,6495],{},[2981,6496,6497],{},"Вимоги:",[2974,6499,6500,6503,6509],{},[2977,6501,6502],{},"Кнопка з можливістю встановлення значення на різних рівнях (Style, Local, Animation)",[2977,6504,6505,6506,3000],{},"Відображення поточного джерела значення (",[2969,6507,6508],{},"DependencyPropertyHelper.GetValueSource",[2977,6510,6511,6512,6514],{},"Кнопки для ",[2969,6513,4620],{}," та запуску анімації",[2965,6516,6517,6520,6521,6523],{},[2981,6518,6519],{},"Підказка:"," Використовуйте ",[2969,6522,3972],{}," для демонстрації найвищого пріоритету:",[3057,6525,6527],{"className":3059,"code":6526,"language":3061,"meta":3062,"style":3062},"var animation = new DoubleAnimation\n{\n    From = 1.0,\n    To = 0.3,\n    Duration = TimeSpan.FromSeconds(2),\n    AutoReverse = true,\n    RepeatBehavior = RepeatBehavior.Forever\n};\n\nmyButton.BeginAnimation(UIElement.OpacityProperty, animation);\n",[2969,6528,6529,6543,6547,6559,6571,6592,6604,6619,6624,6628],{"__ignoreMap":3062},[3066,6530,6531,6533,6536,6538,6540],{"class":3068,"line":3069},[3066,6532,3853],{"class":3072},[3066,6534,6535],{"class":3099}," animation",[3066,6537,3103],{"class":3086},[3066,6539,3624],{"class":3072},[3066,6541,6542],{"class":3079}," DoubleAnimation\n",[3066,6544,6545],{"class":3068,"line":3083},[3066,6546,3087],{"class":3086},[3066,6548,6549,6552,6554,6557],{"class":3068,"line":3090},[3066,6550,6551],{"class":3099},"    From",[3066,6553,3103],{"class":3086},[3066,6555,6556],{"class":6006},"1.0",[3066,6558,5388],{"class":3086},[3066,6560,6561,6564,6566,6569],{"class":3068,"line":3118},[3066,6562,6563],{"class":3099},"    To",[3066,6565,3103],{"class":3086},[3066,6567,6568],{"class":6006},"0.3",[3066,6570,5388],{"class":3086},[3066,6572,6573,6576,6578,6581,6583,6586,6588,6590],{"class":3068,"line":3124},[3066,6574,6575],{"class":3099},"    Duration",[3066,6577,3103],{"class":3086},[3066,6579,6580],{"class":3099},"TimeSpan",[3066,6582,3109],{"class":3086},[3066,6584,6585],{"class":3550},"FromSeconds",[3066,6587,3585],{"class":3086},[3066,6589,3983],{"class":6006},[3066,6591,5401],{"class":3086},[3066,6593,6594,6597,6599,6602],{"class":3068,"line":3135},[3066,6595,6596],{"class":3099},"    AutoReverse",[3066,6598,3103],{"class":3086},[3066,6600,6601],{"class":3072},"true",[3066,6603,5388],{"class":3086},[3066,6605,6606,6609,6611,6614,6616],{"class":3068,"line":3141},[3066,6607,6608],{"class":3099},"    RepeatBehavior",[3066,6610,3103],{"class":3086},[3066,6612,6613],{"class":3099},"RepeatBehavior",[3066,6615,3109],{"class":3086},[3066,6617,6618],{"class":3099},"Forever\n",[3066,6620,6621],{"class":3068,"line":3155},[3066,6622,6623],{"class":3086},"};\n",[3066,6625,6626],{"class":3068,"line":3172},[3066,6627,3808],{"emptyLinePlaceholder":3807},[3066,6629,6630,6632,6634,6637,6639,6642,6644,6647,6649,6652],{"class":3068,"line":3178},[3066,6631,3787],{"class":3099},[3066,6633,3109],{"class":3086},[3066,6635,6636],{"class":3550},"BeginAnimation",[3066,6638,3585],{"class":3086},[3066,6640,6641],{"class":3099},"UIElement",[3066,6643,3109],{"class":3086},[3066,6645,6646],{"class":3099},"OpacityProperty",[3066,6648,3432],{"class":3086},[3066,6650,6651],{"class":3099},"animation",[3066,6653,3720],{"class":3086},[3039,6655],{},[2960,6657,6659],{"id":6658},"резюме","Резюме",[2965,6661,6662,6663,4966],{},"У цій статті ми розібрали фундаментальну концепцію WPF — ",[2981,6664,3029],{},[2974,6666,6667,6673,6679,6685,6690],{},[2977,6668,6669,6672],{},[2981,6670,6671],{},"Проблема CLR-властивостей",": Неможливість підтримки прив'язки даних, стилів, анімацій та успадкування",[2977,6674,6675,6678],{},[2981,6676,6677],{},"Рішення через DependencyProperty",": Централізоване сховище значень з системою пріоритетів",[2977,6680,6681,6684],{},[2981,6682,6683],{},"Value Resolution",": 8 рівнів пріоритету від Animation до Default Value",[2977,6686,6687,6689],{},[2981,6688,4077],{},": Автоматичне \"стікання\" значень по дереву елементів",[2977,6691,6692,6695],{},[2981,6693,6694],{},"Метадані",": Прапорці, що визначають поведінку властивості (AffectsRender, Inherits, тощо)",[3752,6697,6698,6701,6702,6707,6708,6711],{},[2981,6699,6700],{},"Наступний крок:"," У ",[6703,6704,6706],"a",{"href":6705},"15.dependency-properties-part2","наступній статті"," ми навчимося ",[2981,6709,6710],{},"створювати власні Dependency Properties"," з метаданими, валідацією та coercion callbacks. Це критично важливо для розробки custom контролів та UserControls.",[3039,6713],{},[2960,6715,6717],{"id":6716},"додаткові-ресурси","Додаткові ресурси",[3186,6719,6720,6727,6732],{},[3189,6721,6726],{"icon":6722,"title":6723,"target":6724,"to":6725},"i-simple-icons-microsoftazure","📖 Microsoft Docs","_blank","https://learn.microsoft.com/en-us/dotnet/desktop/wpf/properties/dependency-properties-overview","Офіційна документація Dependency Properties",[3189,6728,6731],{"icon":2750,"title":6729,"target":6724,"to":6730},"🎥 Pluralsight Course","https://www.pluralsight.com/courses/wpf-internals","WPF Internals — глибоке занурення у архітектуру",[3189,6733,6735],{"icon":15,"title":6734},"📚 Pro WPF in C#","Книга Adam Nathan — розділ 4 \"Dependency Properties\"",[6737,6738,6739],"style",{},"html pre.shiki code .su1O8, html code.shiki .su1O8{--shiki-light:#0000FF;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .sN1BT, html code.shiki .sN1BT{--shiki-light:#267F99;--shiki-default:#4EC9B0;--shiki-dark:#4EC9B0}html pre.shiki code .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .siwwj, html code.shiki .siwwj{--shiki-light:#001080;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spJ8K, html code.shiki .spJ8K{--shiki-light:#008000;--shiki-default:#6A9955;--shiki-dark:#6A9955}html pre.shiki code .s8Opu, html code.shiki .s8Opu{--shiki-light:#795E26;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .sbdoH, html code.shiki .sbdoH{--shiki-light:#A31515;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .s0P7L, html code.shiki .s0P7L{--shiki-light:#800000;--shiki-default:#808080;--shiki-dark:#808080}html pre.shiki code .sKtos, html code.shiki .sKtos{--shiki-light:#800000;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .sa4r_, html code.shiki .sa4r_{--shiki-light:#E50000;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .su9tN, html code.shiki .su9tN{--shiki-light:#0000FF;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .sCDza, html code.shiki .sCDza{--shiki-light:#AF00DB;--shiki-default:#CE92A4;--shiki-dark:#CE92A4}html pre.shiki code .sD7JJ, html code.shiki .sD7JJ{--shiki-light:#000000FF;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .sJj4R, html code.shiki .sJj4R{--shiki-light:#098658;--shiki-default:#B5CEA8;--shiki-dark:#B5CEA8}",{"title":3062,"searchDepth":3083,"depth":3083,"links":6741},[6742,6743,6747,6751,6755,6760,6764,6768,6779,6780],{"id":2962,"depth":3083,"text":2963},{"id":3043,"depth":3083,"text":3044,"children":6744},[6745,6746],{"id":3051,"depth":3090,"text":3052},{"id":3227,"depth":3090,"text":3228},{"id":3385,"depth":3083,"text":3386,"children":6748},[6749,6750],{"id":3442,"depth":3090,"text":3443},{"id":3764,"depth":3090,"text":3765},{"id":3910,"depth":3083,"text":3911,"children":6752},[6753,6754],{"id":3921,"depth":3090,"text":3922},{"id":4116,"depth":3090,"text":4117},{"id":4241,"depth":3083,"text":4242,"children":6756},[6757,6758,6759],{"id":4248,"depth":3090,"text":4249},{"id":4537,"depth":3090,"text":4538},{"id":4631,"depth":3090,"text":4632},{"id":4948,"depth":3083,"text":4949,"children":6761},[6762,6763],{"id":4955,"depth":3090,"text":4956},{"id":5298,"depth":3090,"text":5299},{"id":5329,"depth":3083,"text":5330,"children":6765},[6766,6767],{"id":5342,"depth":3090,"text":5343},{"id":5601,"depth":3090,"text":5602},{"id":5704,"depth":3083,"text":5705,"children":6769},[6770,6771,6772,6773,6774,6775,6776,6777,6778],{"id":5711,"depth":3090,"text":5712},{"id":5724,"depth":3090,"text":5725},{"id":5813,"depth":3090,"text":5814},{"id":5916,"depth":3090,"text":5917},{"id":6086,"depth":3090,"text":6087},{"id":6097,"depth":3090,"text":6098},{"id":6301,"depth":3090,"text":6302},{"id":6332,"depth":3090,"text":6333},{"id":6486,"depth":3090,"text":6487},{"id":6658,"depth":3083,"text":6659},{"id":6716,"depth":3083,"text":6717},"Розуміння системи властивостей WPF, механізму DependencyProperty та пріоритетів значень","md",null,{},{"title":1441,"description":6781},"WTT58NIWEfkRs7pL986DkZmRewM9bUm6l1qc2rGUznU",[6788,6790],{"title":1437,"path":1438,"stem":1439,"description":6789,"children":-1},"Фундаментальні принципи проєктування користувацьких інтерфейсів для десктопних застосунків. Розуміємо різницю між UI та UX, вивчаємо закони взаємодії, принципи візуальної ієрархії, типографіки, кольору та доступності. Застосовуємо теорію на практиці через WPF та Avalonia.",{"title":1445,"path":1446,"stem":1447,"description":6791,"children":-1},"Система властивостей Avalonia — еволюція WPF DependencyProperty з покращеннями продуктивності та типобезпеки",1777912200630]