[{"data":1,"prerenderedAt":1019},["ShallowReactive",2],{"i-feather:search":3,"i-feather:x":8,"i-feather:moon":10,"i-feather:sun":12,"i-lucide:house-heart":14,"i-fa-brands:youtube":16,"i-fa-brands:twitch":20,"i-fa-brands:github":22,"i-fa-brands:linkedin":25,"i-fa-brands:stack-overflow":28,"i-simple-icons:bluesky":31,"i-fa-brands:mastodon":33,"i-fa-regular:envelope":35,"i-fa-solid:rss":37,"post-\u002Fmodel-view-viewmodel-mvvm-part3-inotifypropertychanged\u002F":39,"post-navigation":622,"i-fa-solid:share-alt":999,"i-fa-brands:facebook":1001,"i-fa-brands:twitter":1003,"i-fa-brands:reddit":1005,"i-fa-brands:patreon":1007,"i-simple-icons:buymeacoffee":1009,"i-fa-brands:paypal":1011,"i-fa-regular:question-circle":1013,"i-feather:arrow-left":1015,"i-feather:arrow-right":1017},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003Cpath d=\"m21 21l-4.35-4.35\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 6L6 18M6 6l12 12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 12.79A9 9 0 1 1 11.21 3A7 7 0 0 0 21 12.79\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"5\"\u002F>\u003Cpath d=\"M12 1v2m0 18v2M4.22 4.22l1.42 1.42m12.72 12.72l1.42 1.42M1 12h2m18 0h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M8.62 13.8A2.25 2.25 0 1 1 12 10.836a2.25 2.25 0 1 1 3.38 2.966l-2.626 2.856a.998.998 0 0 1-1.507 0z\"\u002F>\u003Cpath d=\"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":17,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":19},576,512,"\u003Cpath fill=\"currentColor\" d=\"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597c-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821c11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305m-317.51 213.508V175.185l142.739 81.205z\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":21},"\u003Cpath fill=\"currentColor\" d=\"M391.17 103.47h-38.63v109.7h38.63ZM285 103h-38.63v109.75H285ZM120.83 0L24.31 91.42v329.16h115.83V512l96.53-91.42h77.25L487.69 256V0Zm328.24 237.75l-77.22 73.12h-77.24l-67.6 64v-64h-86.87V36.58h308.93Z\"\u002F>",{"left":4,"top":4,"width":23,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":24},496,"\u003Cpath fill=\"currentColor\" d=\"M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2\"\u002F>",{"left":4,"top":4,"width":26,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":27},448,"\u003Cpath fill=\"currentColor\" d=\"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5c0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7c-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5c67.2 0 79.7 44.3 79.7 101.9z\"\u002F>",{"left":4,"top":4,"width":29,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":30},384,"\u003Cpath fill=\"currentColor\" d=\"M290.7 311L95 269.7L86.8 309l195.7 41zm51-87L188.2 95.7l-25.5 30.8l153.5 128.3zm-31.2 39.7L129.2 179l-16.7 36.5L293.7 300zM262 32l-32 24l119.3 160.3l32-24zm20.5 328h-200v39.7h200zm39.7 80H42.7V320h-40v160h359.5V320h-40z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":32},"\u003Cpath fill=\"currentColor\" d=\"M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037c-.856 3.061-3.978 3.842-6.755 3.37c4.854.826 6.089 3.562 3.422 6.299c-5.065 5.196-7.28-1.304-7.847-2.97c-.104-.305-.152-.448-.153-.327c0-.121-.05.022-.153.327c-.568 1.666-2.782 8.166-7.847 2.97c-2.667-2.737-1.432-5.473 3.422-6.3c-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026\"\u002F>",{"left":4,"top":4,"width":26,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":34},"\u003Cpath fill=\"currentColor\" d=\"M433 179.11c0-97.2-63.71-125.7-63.71-125.7c-62.52-28.7-228.56-28.4-290.48 0c0 0-63.72 28.5-63.72 125.7c0 115.7-6.6 259.4 105.63 289.1c40.51 10.7 75.32 13 103.33 11.4c50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.5 102.5 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7c56.12-6.7 105-41.3 111.23-72.9c9.8-49.8 9-121.5 9-121.5m-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175c25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5l11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1c23.71 27.3 18.4 53 18.4 175z\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":36},"\u003Cpath fill=\"currentColor\" d=\"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48m0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49c-16.841 13.247-50.201 45.072-73.413 44.701c-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646c21.857 17.205 60.134 55.186 103.062 54.955c42.717.231 80.509-37.199 103.053-54.947c49.528-38.783 82.032-64.401 104.947-82.653V400z\"\u002F>",{"left":4,"top":4,"width":26,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":38},"\u003Cpath fill=\"currentColor\" d=\"M128.081 415.959c0 35.369-28.672 64.041-64.041 64.041S0 451.328 0 415.959s28.672-64.041 64.041-64.041s64.04 28.673 64.04 64.041m175.66 47.25c-8.354-154.6-132.185-278.587-286.95-286.95C7.656 175.765 0 183.105 0 192.253v48.069c0 8.415 6.49 15.472 14.887 16.018c111.832 7.284 201.473 96.702 208.772 208.772c.547 8.397 7.604 14.887 16.018 14.887h48.069c9.149.001 16.489-7.655 15.995-16.79m144.249.288C439.596 229.677 251.465 40.445 16.503 32.01C7.473 31.686 0 38.981 0 48.016v48.068c0 8.625 6.835 15.645 15.453 15.999c191.179 7.839 344.627 161.316 352.465 352.465c.353 8.618 7.373 15.453 15.999 15.453h48.068c9.034-.001 16.329-7.474 16.005-16.504\"\u002F>",{"id":40,"title":41,"author":42,"body":43,"comments":457,"date":595,"dateModified":596,"description":597,"extension":598,"headings":599,"heroImage":608,"meta":609,"path":67,"permalink":67,"published":610,"stem":611,"tags":612,"timeToRead":621},"posts\u002Fposts\u002F2014\u002Fmodel-view-viewmodel-mvvm-part3-inotifypropertychanged\u002Findex.md","Model-View-ViewModel (MVVM) - Part 3 - INotifyPropertyChanged","Muhammad Rehan Saeed",{"type":44,"value":45,"toc":454},"minimark",[46,75,99,106,139,142,149,172,175,178,189,192,210,223,243,254,257,260,272,275,292,295,306,313,316,319,322,328,334,345,351,363,380,391,409,423,426,429,436,447,450],[47,48,49,57,63,69],"ol",{},[50,51,52],"li",{},[53,54,56],"a",{"href":55},"\u002Fmodel-view-viewmodel-mvvm-part1-overview\u002F","Model-View-ViewModel (MVVM) - Overview",[50,58,59],{},[53,60,62],{"href":61},"\u002Fmodel-view-viewmodel-mvvm-part2-idisposable\u002F","Model-View-ViewModel (MVVM) - IDisposable",[50,64,65],{},[53,66,68],{"href":67},"\u002Fmodel-view-viewmodel-mvvm-part3-inotifypropertychanged\u002F","Model-View-ViewModel (MVVM) - INotifyPropertyChanged",[50,70,71],{},[53,72,74],{"href":73},"\u002Fmodel-view-viewmodel-mvvm-part4-inotifydataerrorinfo\u002F","Model-View-ViewModel (MVVM) - INotifyDataErrorInfo",[76,77,78,79,88,89,93,94,98],"p",{},"I know there have been lots of Model-View-ViewModel (MVVM) articles talking about ",[53,80,87],{"href":81,"rel":82,"target":86},"http:\u002F\u002Fmsdn.microsoft.com\u002Fen-GB\u002Flibrary\u002Fsystem.componentmodel.inotifypropertychanged.aspx",[83,84,85],"nofollow","noopener","noreferrer","_blank","INotifyPropertyChanged",". I've read ",[90,91,92],"strong",{},"lots"," of them and this is the aggregation of all the knowledge I've learned plus some cool new stuff (I've not seen it done anywhere else but I could be wrong) which I've also covered in my ",[53,95,97],{"href":96},"\u002Freactive-extensions-part1-replacing-events\u002F","Reactive Extensions (Rx) posts",".",[76,100,101,102,105],{},"So what are the main aims of a base class implementing ",[53,103,87],{"href":81,"rel":104,"target":86},[83,84,85],"? Well, I think there are a few:",[107,108,109,116,119,127,130,133,136],"ul",{},[50,110,111,112,115],{},"Performance - Performance is king. It needs to be fast and I mean ",[90,113,114],{},"really"," fast. You can't afford for your UI to freeze up while your view works out all its bindings to the properties in your view model.",[50,117,118],{},"Simplicity - I want to raise property changed events with one line of code and I don't want to mess around with strings if I can help it.",[50,120,121,122,126],{},"Reactive Extensions (Rx) - Events are old school, I want an observable property changed event notification system instead of the ",[123,124,125],"code",{},"PropertyChanged"," C# event.",[50,128,129],{},"Human Error - I don't want to raise property change events for properties that don't exist by accident.",[50,131,132],{},"Dependent Properties - Often, the value of one property depends on the value of another. I need to handle this somehow.",[50,134,135],{},"Re-factoring - I don't want my code to break when I rename a property and forget to rename a string too.",[50,137,138],{},"Has it Really Changed - I don't want to raise a property changed event if the value of a property has not really changed.",[76,140,141],{},"So, without further ado, here is my implementation.",[143,144],"pre",{"className":145,"language":146,"meta":147,"style":147,"html":148},"language-cs shiki shiki-themes light-plus monokai","cs","","\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">namespace\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> Framework\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ComponentModel\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">{\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">    using\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> System\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">    using\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> System\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ComponentModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">    using\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> System\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Diagnostics\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">    using\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> System\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Reactive\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Linq\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">    using\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> System\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Reflection\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">    using\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> System\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Runtime\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">CompilerServices\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F Notifies subscribers that a property in this instance is changing or has changed.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> abstract\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> NotifyPropertyChanges\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">Disposable\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sw29p\">INotifyPropertyChanged\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> \u002F\u002F, INotifyPropertyChanging\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Occurs when a property value changes.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">        event\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> PropertyChangedEventHandler\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> INotifyPropertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">PropertyChanged\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">            add\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> { \u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyChanged\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> +=\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> value\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">; }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">            remove\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> { \u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyChanged\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -=\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> value\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">; }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Occurs when a property value is changing.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F event PropertyChangingEventHandler INotifyPropertyChanging.PropertyChanging\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F     add { this.PropertyChanging += value; }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F     remove { this.PropertyChanging -= value; }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F &lt;summary&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Occurs when a property value changes.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F &lt;\u002Fsummary&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        private\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> event\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> PropertyChangedEventHandler\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Occurs when a property value is changing.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F private event PropertyChangingEventHandler PropertyChanging;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F &lt;summary&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Gets the when property changed observable event. Occurs when a property value changes.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F &lt;\u002Fsummary&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F &lt;value&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F The when property changed observable event.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F &lt;\u002Fvalue&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        public\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> IObservable\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">WhenPropertyChanged\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">            get\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ThrowIfDisposed\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                return\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> Observable\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">                    .\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">FromEventPattern\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">PropertyChangedEventHandler\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sw29p\">PropertyChangedEventArgs\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                        h\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyChanged\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> +=\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> h\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                        h\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyChanged\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> -=\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> h\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">                    .\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Select\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">x\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> x\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">EventArgs\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">PropertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Gets the when property changing observable event. Occurs when a property value is changing.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">value\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F The when property changing observable event.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">value\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F public IObservable&lt;EventPattern&lt;PropertyChangingEventArgs&gt;&gt; WhenPropertyChanging\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F     get\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F     {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F         return Observable\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F             .FromEventPattern&lt;PropertyChangingEventHandler, PropertyChangingEventArgs&gt;(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F                 h =&gt; this.PropertyChanging += h,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F                 h =&gt; this.PropertyChanging -= h)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F             .AsObservable();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F     }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F &lt;summary&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Raises the PropertyChanged event.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F &lt;\u002Fsummary&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F &lt;param name=\"propertyName\"&gt;Name of the property.&lt;\u002Fparam&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> OnPropertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">([\u003C\u002Fspan>\u003Cspan class=\"sw29p\">CallerMemberName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">] \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">            Debug\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Assert\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">                string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IsNullOrEmpty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">) \u003C\u002Fspan>\u003Cspan class=\"snCLD\">||\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">                (\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">GetType\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">().\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">GetRuntimeProperty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">) \u003C\u002Fspan>\u003Cspan class=\"snCLD\">!=\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">),\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"swiDo\">                \"Check that the property name exists for this instance.\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sw29p\">            PropertyChangedEventHandler\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> eventHandler\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">eventHandler\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> !=\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sWm5y\">                eventHandler\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> PropertyChangedEventArgs\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">));\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Raises the PropertyChanged event.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"propertyNames\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The property names.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> OnPropertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">params\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">[] \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> ==\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                throw\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> ArgumentNullException\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">nameof\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">));\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            foreach\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\u003C\u002Fspan>\u003Cspan class=\"smL5M\"> in\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Raises the PropertyChanging event.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"propertyName\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">Name of the property.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> OnPropertyChanging\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">([\u003C\u002Fspan>\u003Cspan class=\"sw29p\">CallerMemberName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">] \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">            Debug\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Assert\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">                string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">IsNullOrEmpty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">) \u003C\u002Fspan>\u003Cspan class=\"snCLD\">||\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">                (\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">GetType\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">().\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">GetRuntimeProperty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">) \u003C\u002Fspan>\u003Cspan class=\"snCLD\">!=\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">),\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"swiDo\">                \"Check that the property name exists for this instance.\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">            \u002F\u002F PropertyChangingEventHandler eventHandler = this.PropertyChanging;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">            \u002F\u002F if (eventHandler != null)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">            \u002F\u002F {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">            \u002F\u002F     eventHandler(this, new PropertyChangingEventArgs(propertyName));\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">            \u002F\u002F }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Raises the PropertyChanging event.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"propertyNames\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The property names.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> OnPropertyChanging\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">params\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">[] \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> ==\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                throw\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> ArgumentNullException\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">nameof\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">));\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            foreach\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\u003C\u002Fspan>\u003Cspan class=\"smL5M\"> in\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanging\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Sets the value of the property to the specified value if it has changed.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">typeparam\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"TProp\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The type of the property.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">typeparam\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"currentValue\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The current value of the property.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"newValue\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The new value of the property.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"propertyName\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">Name of the property.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if the property was changed, otherwise \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">false\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> SetProperty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">TProp\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">            ref\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> TProp\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> currentValue\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sw29p\">            TProp\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> newValue\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            [\u003C\u002Fspan>\u003Cspan class=\"sw29p\">CallerMemberName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">] \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ThrowIfDisposed\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"snCLD\">!\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Equals\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">currentValue\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">newValue\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">))\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanging\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                currentValue\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> newValue\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                return\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            return\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Sets the value of the property to the specified value if it has changed.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">typeparam\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"TProp\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The type of the property.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">typeparam\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"currentValue\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The current value of the property.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"newValue\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The new value of the property.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"propertyNames\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The names of all properties changed.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if the property was changed, otherwise \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">false\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> SetProperty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">TProp\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">            ref\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> TProp\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> currentValue\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sw29p\">            TProp\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> newValue\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">            params\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">[] \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ThrowIfDisposed\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"snCLD\">!\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Equals\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">currentValue\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">newValue\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">))\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanging\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                currentValue\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> newValue\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                return\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            return\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Sets the value of the property to the specified value if it has changed.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"equal\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">A function which returns \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if the property value has changed, otherwise \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">false\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"action\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The action where the property is set.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"propertyName\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">Name of the property.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if the property was changed, otherwise \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">false\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> SetProperty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sw29p\">            Func\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">bool\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">equal\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sw29p\">            Action\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> action\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            [\u003C\u002Fspan>\u003Cspan class=\"sw29p\">CallerMemberName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">] \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> null\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ThrowIfDisposed\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">equal\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">())\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                return\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanging\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sWm5y\">            action\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            return\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F Sets the value of the property to the specified value if it has changed.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">summary\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"equal\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">A function which returns \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if the property value has changed, otherwise \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">false\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"action\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The action where the property is set.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"propertyNames\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The property names.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">param\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">true\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> if the property was changed, otherwise \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">false\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> SetProperty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sw29p\">            Func\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">bool\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">equal\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sw29p\">            Action\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> action\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">            params\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">[] \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ThrowIfDisposed\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">equal\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">())\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                return\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> false\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanging\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sWm5y\">            action\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyNames\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            return\u003C\u002Fspan>\u003Cspan class=\"sMc8R\"> true\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">        }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">}\n\u003C\u002Fspan>\u003C\u002Fspan>",[150,151,153,171],"h1",{"id":152},"simple-example",[53,154,157],{"href":155,"aria-hidden":156},"#simple-example","true",[158,159,165],"svg",{"xmlns":160,"xmlns:xlink":161,"viewBox":162,"version":163,"width":164,"height":164,"aria-hidden":156},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxlink","0 0 16 16","1.1",22,[166,167],"path",{"fill":168,"fill-rule":169,"d":170},"currentColor","evenodd","M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z","Simple Example",[76,173,174],{},"An example of how you can use this base class is as follows.",[143,176],{"className":145,"language":146,"meta":147,"style":147,"html":177},"\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> CatCountViewModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">NotifyPropertyChanges\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">{\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> int\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> numberOfCats\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> int\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> NumberOfCats\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">        get\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">numberOfCats\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">        set\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">SetProperty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">ref\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">numberOfCats\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">value\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">}\n\u003C\u002Fspan>\u003C\u002Fspan>",[150,179,181,188],{"id":180},"performance",[53,182,184],{"href":183,"aria-hidden":156},"#performance",[158,185,186],{"xmlns":160,"xmlns:xlink":161,"viewBox":162,"version":163,"width":164,"height":164,"aria-hidden":156},[166,187],{"fill":168,"fill-rule":169,"d":170},"Performance",[76,190,191],{},"As I said before, performance is king. A slow application is a frustrating application. However, there has always been a problem. When you want to raise a property changed event, you have to pass in a string. We can't check the validity of the string at compile time, only at runtime. So we can get errors due to typos etc. which can get overlooked.",[76,193,194,195,198,199,204,205,209],{},"There are a lot of implementations of ",[53,196,87],{"href":81,"rel":197,"target":86},[83,84,85]," that use reflection or expression trees and as ",[53,200,203],{"href":201,"rel":202,"target":86},"http:\u002F\u002Fblog.quantumbitdesigns.com\u002F2010\u002F01\u002F26\u002Fmvvm-lambda-vs-inotifypropertychanged-vs-dependencyobject",[83,84,85],"this"," and ",[53,206,203],{"href":207,"rel":208,"target":86},"http:\u002F\u002Fblog.amusedia.com\u002F2013\u002F06\u002Finotifypropertychanged-implementation.html",[83,84,85]," blog show, using reflection is a terribly slow method of raising an event and to be avoided.",[76,211,212,213,218,219,222],{},"Luckily, Microsoft introduced the ",[53,214,217],{"href":215,"rel":216,"target":86},"http:\u002F\u002Fmsdn.microsoft.com\u002Fen-gb\u002Flibrary\u002Fsystem.runtime.compilerservices.callermembernameattribute.aspx",[83,84,85],"CallerMemberNameAttribute"," attribute, which means that as in the above example, we don't need to add a string for the property name, it gets added for us to the last optional parameter in the ",[123,220,221],{},"SetProperty"," method.",[76,224,225,226,228,229,234,235,238,239,242],{},"The ",[123,227,221],{}," method uses the ",[53,230,233],{"href":231,"rel":232,"target":86},"http:\u002F\u002Fmsdn.microsoft.com\u002Fen-us\u002Flibrary\u002F14akc2c7.aspx",[83,84,85],"ref keyword"," to pass the parameter by reference (Passing parameters by reference is faster). It then checks to see if the ",[123,236,237],{},"numberOfCats"," parameter is different from the ",[123,240,241],{},"value"," parameter (There is no point raising a property changed event if they are the same). Only then, do we raise a property changed event.",[150,244,246,253],{"id":245},"handling-dependent-properties",[53,247,249],{"href":248,"aria-hidden":156},"#handling-dependent-properties",[158,250,251],{"xmlns":160,"xmlns:xlink":161,"viewBox":162,"version":163,"width":164,"height":164,"aria-hidden":156},[166,252],{"fill":168,"fill-rule":169,"d":170},"Handling Dependent Properties",[76,255,256],{},"But what about dependent properties. Where one property affects the value of another. Well, lets take a look at another example.",[143,258],{"className":145,"language":146,"meta":147,"style":147,"html":259},"\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> CatCounter\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">NotifyPropertyChanges\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">{\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> int\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> numberOfCats\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> int\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> NumberOfCats\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">        get\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">numberOfCats\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">        set\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">SetProperty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">ref\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">numberOfCats\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">value\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"NumberOfCats\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"NumberOfCatsDescription\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> NumberOfCatsDescription\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"swiDo\"> $\"\u003C\u002Fspan>\u003Cspan class=\"sfK3G\">{\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sfK3G\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">NumberOfCats\u003C\u002Fspan>\u003Cspan class=\"sfK3G\">}\u003C\u002Fspan>\u003Cspan class=\"swiDo\"> Cats Counted\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">}\n\u003C\u002Fspan>\u003C\u002Fspan>",[76,261,262,263,268,269,271],{},"You can see, that I've not done anything spectacular and just passed in the strings. As I'm using the ",[53,264,267],{"href":265,"rel":266,"target":86},"http:\u002F\u002Fmsdn.microsoft.com\u002Fen-us\u002Flibrary\u002Fw5zay9db.aspx",[83,84,85],"params"," keyword, you can pass in as many strings as you want and the ",[123,270,221],{}," method will raise a property changed event for each one.",[76,273,274],{},"If you give me a moment, I will explain why I think this is the right compromise to make. Lets make no mistake, you do need to compromise between performance and simplicity\u002Fmaintainability. There are approaches which make this eventuality simpler and easier to understand but they can and will degrade performance.",[76,276,277,278,283,284,287,288,291],{},"So does using strings cause problems? First of all, if you use a Visual Studio Add-in like Resharper, this problem is ",[53,279,282],{"href":280,"rel":281,"target":86},"http:\u002F\u002Fblog.jetbrains.com\u002Fdotnet\u002F2012\u002F07\u002F24\u002Finotifypropertychanged-support-in-resharper-7",[83,84,85],"solved"," as it checks that the strings match the property name for you. Secondly, as a backup the ",[123,285,286],{},"OnPropertyChanged"," method in the implementation above contains some ",[123,289,290],{},"Debug.Assert"," statements (These are removed in Release mode and have no effect on performance) to check that the property names exist and are correct, if they are not you get a error message. Thirdly, this is fairly rare in my experience and I can deal with the overhead of having a couple of extra strings.",[76,293,294],{},"Again, this is a choice I've made to go with performance over maintainability.",[150,296,298,305],{"id":297},"dealing-with-wrapped-objects",[53,299,301],{"href":300,"aria-hidden":156},"#dealing-with-wrapped-objects",[158,302,303],{"xmlns":160,"xmlns:xlink":161,"viewBox":162,"version":163,"width":164,"height":164,"aria-hidden":156},[166,304],{"fill":168,"fill-rule":169,"d":170},"Dealing with Wrapped Objects",[76,307,308,309,312],{},"What if you want to wrap an object that looks like the one below with a class that supports ",[53,310,87],{"href":81,"rel":311,"target":86},[83,84,85],"? This is a scenario I have not seen many people cover but occurs fairly often in my experience.",[143,314],{"className":145,"language":146,"meta":147,"style":147,"html":315},"\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> CatCount\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">{\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> int\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> Count\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> { \u003C\u002Fspan>\u003Cspan class=\"s4J9F\">get\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">; \u003C\u002Fspan>\u003Cspan class=\"s4J9F\">set\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">; }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">}\n\u003C\u002Fspan>\u003C\u002Fspan>",[76,317,318],{},"An example view model for the CatCount class can be found below.",[143,320],{"className":145,"language":146,"meta":147,"style":147,"html":321},"\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> CatCountModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">NotifyPropertyChanges\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">{\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    private\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> CatCount\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> catCount\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> int\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> NumberOfCats\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">        get\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> { \u003C\u002Fspan>\u003Cspan class=\"smL5M\">return\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">catCount\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Count\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">; }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">        set\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> { \u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">SetProperty\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(() \u003C\u002Fspan>\u003Cspan class=\"snCLD\">=&gt;\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">catCount\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Count\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> ==\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> value\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, () \u003C\u002Fspan>\u003Cspan class=\"snCLD\">=&gt;\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">catCount\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Count\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> value\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">); }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">}\n\u003C\u002Fspan>\u003C\u002Fspan>",[76,323,324,325,327],{},"So here we are providing the ",[123,326,221],{}," method with two delegates. We can't use the ref keyword we used earlier because this gives us the compiler error \"A property, indexer or dynamic member access may not be passed as an out or ref parameter\". So we use delegates as an alternative which is not as fast as the ref keyword but almost as fast.",[76,329,330,331,333],{},"The first delegate determines if the cat count has actually changed. Only if it has (Remember, executing a delegate is far cheaper than updating the UI), do we call the next delegate which actually sets the value. Finally the ",[123,332,221],{}," method raises a property changed event.",[150,335,337,344],{"id":336},"using-reactive-extensions-rx-to-replace-the-propertychanged-event",[53,338,340],{"href":339,"aria-hidden":156},"#using-reactive-extensions-rx-to-replace-the-propertychanged-event",[158,341,342],{"xmlns":160,"xmlns:xlink":161,"viewBox":162,"version":163,"width":164,"height":164,"aria-hidden":156},[166,343],{"fill":168,"fill-rule":169,"d":170},"Using Reactive Extensions (Rx) to Replace the PropertyChanged Event",[76,346,347,348,98],{},"C# events are old school. Reactive Extensions (Rx) provides a cleaner and far more powerful drop-in replacement for C# events. I'm not going to go over the advantages of Reactive Extensions here but you can take a look at a series of blog posts I've done in the ",[53,349,350],{"href":96},"past",[76,352,353,354,356,357,362],{},"We can hide the ",[123,355,125],{}," C# event by explicitly implementing the interface (Click ",[53,358,361],{"href":359,"rel":360,"target":86},"http:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F143405\u002Fc-sharp-interfaces-implicit-implementation-versus-explicit-implementation",[83,84,85],"here"," for details on implicit versus explicit implementations of interfaces).",[76,364,225,365,367,368,371,372,375,376,379],{},[123,366,125],{}," C# event can still be accessed by first casting the object to ",[53,369,87],{"href":81,"rel":370,"target":86},[83,84,85],". Binding in XAML languages, which uses this interface continues to work. Our new Reactive Extensions (Rx) observable event called ",[123,373,374],{},"WhenPropertyChanged"," of type ",[123,377,378],{},"IObservable\u003Cstring>"," (The string is the property name) is now the default method of subscribing for property changed events and we've hidden away the old C# event.",[150,381,383,390],{"id":382},"implementing-inotifypropertychanging",[53,384,386],{"href":385,"aria-hidden":156},"#implementing-inotifypropertychanging",[158,387,388],{"xmlns":160,"xmlns:xlink":161,"viewBox":162,"version":163,"width":164,"height":164,"aria-hidden":156},[166,389],{"fill":168,"fill-rule":169,"d":170},"Implementing INotifyPropertyChanging",[76,392,393,394,402,403,98],{},"Take another look at the title of this paragraph, it says ",[53,395,398,399],{"href":396,"rel":397,"target":86},"http:\u002F\u002Fmsdn.microsoft.com\u002Fen-us\u002Flibrary\u002Fsystem.componentmodel.inotifypropertychanging%28v=vs.110%29.aspx",[83,84,85],"INotifyPropertyChang",[90,400,401],{},"ing"," and not ",[53,404,398,406],{"href":81,"rel":405,"target":86},[83,84,85],[90,407,408],{},"ed",[76,410,411,412,415,416,419,420,422],{},"This interface has a single event called ",[123,413,414],{},"PropertyChang**ing**"," and is raised ",[90,417,418],{},"before"," a property is about to be changed. This interface is not actually used by any XAML framework but does complement the ",[123,421,87],{}," interface and can be useful in your view models when you want to know that a property is about to change and do something about it.",[76,424,425],{},"Given that we've written a base class, it is super easy to include it too. You should note that this interface only exists in the full .NET Framework and Silverlight. It does not exist on Windows Store or Windows Phone platforms.",[76,427,428],{},"As we are writing a base class for a Portable Class Library (PCL), I've commented it out. However, if I were to create a full .NET or Silverlight class library, I would definitely put that code back in.",[76,430,431,432,435],{},"If you find the interface useful and you too are using a Portable Class Library (PCL), you could take a copy of the ",[123,433,434],{},"INotifyPropertyChanging"," interface and include it with your base class. If Microsoft ever decide to include it into the PCL, you simply need to remove your class and use the one in the framework.",[150,437,439,446],{"id":438},"conclusions",[53,440,442],{"href":441,"aria-hidden":156},"#conclusions",[158,443,444],{"xmlns":160,"xmlns:xlink":161,"viewBox":162,"version":163,"width":164,"height":164,"aria-hidden":156},[166,445],{"fill":168,"fill-rule":169,"d":170},"Conclusions",[76,448,449],{},"I have gone through many iterations to get to this base class. As I've shown, I've had very particular goals in mind. Your mileage may vary but I believe with the tools Microsoft have given us, this is a good compromise and covers all the scenarios I can think of. I'd be very interested if anyone has any comments or thoughts on improvements. Feel free to sound-off in the comments.",[451,452,453],"style",{},"html pre.shiki code .s4J9F, html code.shiki .s4J9F{--shiki-default:#0000FF;--shiki-default-font-style:inherit;--shiki-dark:#66D9EF;--shiki-dark-font-style:italic}html pre.shiki code .sw29p, html code.shiki .sw29p{--shiki-default:#267F99;--shiki-default-text-decoration:inherit;--shiki-dark:#A6E22E;--shiki-dark-text-decoration:underline}html pre.shiki code .sjLUg, html code.shiki .sjLUg{--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .smL5M, html code.shiki .smL5M{--shiki-default:#AF00DB;--shiki-dark:#F92672}html pre.shiki code .s1q82, html code.shiki .s1q82{--shiki-default:#008000;--shiki-dark:#88846F}html pre.shiki code .sOBmp, html code.shiki .sOBmp{--shiki-default:#800000;--shiki-dark:#88846F}html pre.shiki code .sjbfc, html code.shiki .sjbfc{--shiki-default:#800000;--shiki-dark:#F92672}html pre.shiki code .sJvqV, html code.shiki .sJvqV{--shiki-default:#0000FF;--shiki-dark:#F92672}html pre.shiki code .sFrd5, html code.shiki .sFrd5{--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .sK46n, html code.shiki .sK46n{--shiki-default:#0000FF;--shiki-dark:#FD971F}html pre.shiki code .snCLD, html code.shiki .snCLD{--shiki-default:#000000;--shiki-dark:#F92672}html pre.shiki code .sWm5y, html code.shiki .sWm5y{--shiki-default:#795E26;--shiki-dark:#A6E22E}html pre.shiki code .sMc8R, html code.shiki .sMc8R{--shiki-default:#0000FF;--shiki-dark:#AE81FF}html pre.shiki code .swiDo, html code.shiki .swiDo{--shiki-default:#A31515;--shiki-dark:#E6DB74}html pre.shiki code .snDo4, html code.shiki .snDo4{--shiki-default:#E50000;--shiki-dark:#A6E22E}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 .sfK3G, html code.shiki .sfK3G{--shiki-default:#000000FF;--shiki-dark:#F8F8F2}",{"title":147,"searchDepth":455,"depth":455,"links":456},2,[],{"issue":458,"comments":462},{"number":459,"title":460,"html_url":461},92,"[Comment] Model-View-ViewModel (MVVM) - Part 3 - INotifyPropertyChanged","https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92",[463,475,483,491,499,507,515,523,531,539,547,555,563,571,579,587],{"id":464,"html_url":465,"body_html":466,"created_at":467,"updated_at":467,"author_association":468,"user":469,"reactions":473},627264265,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264265","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F2ed3c0a5ab1c196d6b4f447e4e09b74aa77a0979e934889a46794d0cec075e70\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f65643536393037323266643363613639303961303765306263626361643436343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Mahgnilloc\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F2ed3c0a5ab1c196d6b4f447e4e09b74aa77a0979e934889a46794d0cec075e70\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f65643536393037323266643363613639303961303765306263626361643436343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Mahgnilloc\u003C\u002Fstrong> commented on \u003Cstrong>2014-09-03 07:34:00\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Thanks, your wrapped property really helped me.\u003C\u002Fp>\n\u003Cp>I think you missed out the equals check in the two \u003Ccode>SetProperty\u003C\u002Fcode> functions though\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>equal\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>false\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>","2020-05-12T10:46:04Z","OWNER",{"login":470,"avatar_url":471,"html_url":472},"RehanSaeed","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2270364?v=4","https:\u002F\u002Fgithub.com\u002FRehanSaeed",{"url":474,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264265\u002Freactions",{"id":476,"html_url":477,"body_html":478,"created_at":479,"updated_at":479,"author_association":468,"user":480,"reactions":481},627264319,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264319","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Muhammad Rehan Saeed\u003C\u002Fstrong> commented on \u003Cstrong>2014-09-04 08:03:54\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Thanks, your wrapped property really helped me.\u003C\u002Fp>\n\u003Cp>I think you missed out the equals check in the two \u003Ccode>SetProperty\u003C\u002Fcode> functions though\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>equal\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>false\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fblockquote>\n\u003Cp>Thanks for the comment Mahgnilloc. I've updated the code to reflect your comment.\u003C\u002Fp>","2020-05-12T10:46:11Z",{"login":470,"avatar_url":471,"html_url":472},{"url":482,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264319\u002Freactions",{"id":484,"html_url":485,"body_html":486,"created_at":487,"updated_at":487,"author_association":468,"user":488,"reactions":489},627264380,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264380","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F3eb5c4fbb36a579c3d13b32d02dbfd170e60a0e08659118b8e703c99034e44d7\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f64323633343130386661333938663364373833663664633661383230663763393f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Rached\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F3eb5c4fbb36a579c3d13b32d02dbfd170e60a0e08659118b8e703c99034e44d7\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f64323633343130386661333938663364373833663664633661383230663763393f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Rached\u003C\u002Fstrong> commented on \u003Cstrong>2015-08-17 16:44:57\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Thanks for the comment Mahgnilloc. I've updated the code to reflect your comment.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Your blog series on mvvm is helping me a lot, thanks.. the \u003Ccode>SetProperty\u003C\u002Fcode> should be bool instead of void.\u003C\u002Fp>","2020-05-12T10:46:18Z",{"login":470,"avatar_url":471,"html_url":472},{"url":490,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264380\u002Freactions",{"id":492,"html_url":493,"body_html":494,"created_at":495,"updated_at":495,"author_association":468,"user":496,"reactions":497},627264430,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264430","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2015-08-18 12:07:54\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Your blog series on mvvm is helping me a lot, thanks.. the \u003Ccode>SetProperty\u003C\u002Fcode> should be bool instead of void.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Well spotted, thanks. Fixed.\u003C\u002Fp>","2020-05-12T10:46:25Z",{"login":470,"avatar_url":471,"html_url":472},{"url":498,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264430\u002Freactions",{"id":500,"html_url":501,"body_html":502,"created_at":503,"updated_at":503,"author_association":468,"user":504,"reactions":505},627264469,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264469","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F49e3d731edc2653e27327c0bcd7429d9c980d90d1c30dc4ba3e7245197439b51\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f30653534613032383834383435383935373566333138396334333936313932643f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Manthravadi, Siva Harsha Vardhan\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F49e3d731edc2653e27327c0bcd7429d9c980d90d1c30dc4ba3e7245197439b51\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f30653534613032383834383435383935373566333138396334333936313932643f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Manthravadi, Siva Harsha Vardhan\u003C\u002Fstrong> commented on \u003Cstrong>2015-10-17 17:48:17\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Ccode>Disposable\u003C\u002Fcode> cannot be inherited anymore ...do you see any other alternatives?\u003C\u002Fp>","2020-05-12T10:46:32Z",{"login":470,"avatar_url":471,"html_url":472},{"url":506,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264469\u002Freactions",{"id":508,"html_url":509,"body_html":510,"created_at":511,"updated_at":511,"author_association":468,"user":512,"reactions":513},627264510,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264510","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2015-10-21 17:11:49\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Ccode>Disposable\u003C\u002Fcode> cannot be inherited anymore ...do you see any other alternatives?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Not sure what you mean. Have you set the class to sealed?\u003C\u002Fp>","2020-05-12T10:46:38Z",{"login":470,"avatar_url":471,"html_url":472},{"url":514,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264510\u002Freactions",{"id":516,"html_url":517,"body_html":518,"created_at":519,"updated_at":519,"author_association":468,"user":520,"reactions":521},627264545,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264545","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F618ebd2b0a25894b1ac19c3de4418e06ec26803ea367b81899f25d905303466c\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39343835376432353535356232646232623465613735333838633663646161623f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Dieter\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F618ebd2b0a25894b1ac19c3de4418e06ec26803ea367b81899f25d905303466c\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39343835376432353535356232646232623465613735333838633663646161623f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Dieter\u003C\u002Fstrong> commented on \u003Cstrong>2016-01-16 13:50:00\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hello Rehan,\u003C\u002Fp>\n\u003Cp>Great implementation.\u003C\u002Fp>\n\u003Cp>Just a minor finding:\u003Cbr \u002F>\nI guess there's a typo in your 'Dealing with Wrapped Objects' example. The \u003Ccode>==\u003C\u002Fcode> and \u003Ccode>=\u003C\u002Fcode> should be flipped.\u003C\u002Fp>\n\u003Cp>Have a great weekend\u003Cbr \u002F>\nDieter\u003C\u002Fp>","2020-05-12T10:46:45Z",{"login":470,"avatar_url":471,"html_url":472},{"url":522,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264545\u002Freactions",{"id":524,"html_url":525,"body_html":526,"created_at":527,"updated_at":527,"author_association":468,"user":528,"reactions":529},627264601,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264601","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-01-26 08:43:59\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hello Rehan,\u003C\u002Fp>\n\u003Cp>Great implementation.\u003C\u002Fp>\n\u003Cp>Just a minor finding:\u003Cbr \u002F>\nI guess there's a typo in your 'Dealing with Wrapped Objects' example. The \u003Ccode>==\u003C\u002Fcode> and \u003Ccode>=\u003C\u002Fcode> should be flipped.\u003C\u002Fp>\n\u003Cp>Have a great weekend\u003Cbr \u002F>\nDieter\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Actually no, the second delegate is passed to determine whether the two objects are equal. Only if they are equal, do we raise a property changed event.\u003C\u002Fp>","2020-05-12T10:46:52Z",{"login":470,"avatar_url":471,"html_url":472},{"url":530,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264601\u002Freactions",{"id":532,"html_url":533,"body_html":534,"created_at":535,"updated_at":535,"author_association":468,"user":536,"reactions":537},627264660,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264660","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fbe23dd5e371566fef65db25ae02aec6ceb04083abe26bdc70399cf2f2807a46a\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32616465626166376639326431313731373135363361333637353236303561393f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Dieter\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fbe23dd5e371566fef65db25ae02aec6ceb04083abe26bdc70399cf2f2807a46a\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32616465626166376639326431313731373135363361333637353236303561393f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Dieter\u003C\u002Fstrong> commented on \u003Cstrong>2016-05-26 08:56:55\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Actually no, the second delegate is passed to determine whether the two objects are equal. Only if they are equal, do we raise a property changed event.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Hello Rehan,\u003C\u002Fp>\n\u003Cp>Are you sure?\u003Cbr \u002F>\nThe procedure is\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>protected\u003C\u002Fspan> \u003Cspan>Boolean\u003C\u002Fspan> \u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>Func\u003C\u002Fspan> \u003Cspan>equal\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>Action\u003C\u002Fspan> \u003Cspan>action\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>[\u003C\u002Fspan>\u003Cspan>CallerMemberName\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>String\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>null\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>So the first delegate seems to be the equality check.\u003C\u002Fp>\n\u003Cp>Testing your example only works if I'm using\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>catCount\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Count\u003C\u002Fspan> \u003Cspan>==\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>catCount\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Count\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Instead of\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>catCount\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Count\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>catCount\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Count\u003C\u002Fspan> \u003Cspan>==\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>","2020-05-12T10:46:59Z",{"login":470,"avatar_url":471,"html_url":472},{"url":538,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264660\u002Freactions",{"id":540,"html_url":541,"body_html":542,"created_at":543,"updated_at":543,"author_association":468,"user":544,"reactions":545},627264712,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264712","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-05-26 17:16:08\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hello Rehan,\u003C\u002Fp>\n\u003Cp>are you sure?\u003Cbr \u002F>\nThe procedure is\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>protected\u003C\u002Fspan> \u003Cspan>Boolean\u003C\u002Fspan> \u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>Func\u003C\u002Fspan> \u003Cspan>equal\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>Action\u003C\u002Fspan> \u003Cspan>action\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>[\u003C\u002Fspan>\u003Cspan>CallerMemberName\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>String\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>null\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>So the first delegate seems to be the equality check.\u003C\u002Fp>\n\u003Cp>Testing your example only works if I'm using\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>catCount\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Count\u003C\u002Fspan> \u003Cspan>==\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>catCount\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Count\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Instead of\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>catCount\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Count\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>catCount\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Count\u003C\u002Fspan> \u003Cspan>==\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fblockquote>\n\u003Cp>Scratch that, you are absolutely correct sir! It's been some time since I've looked at this code.\u003C\u002Fp>","2020-05-12T10:47:07Z",{"login":470,"avatar_url":471,"html_url":472},{"url":546,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264712\u002Freactions",{"id":548,"html_url":549,"body_html":550,"created_at":551,"updated_at":551,"author_association":468,"user":552,"reactions":553},627264772,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264772","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc2fa2b5e9d3cd2cb9f688507bf4f90d232a7e1d83a7c9101667a3b25dc8a368e\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32303930616532616537653865303333623235663530313932396639396439393f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Ole Kristian\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc2fa2b5e9d3cd2cb9f688507bf4f90d232a7e1d83a7c9101667a3b25dc8a368e\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32303930616532616537653865303333623235663530313932396639396439393f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Ole Kristian\u003C\u002Fstrong> commented on \u003Cstrong>2017-10-23 22:43:15\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Scratch that, you are absolutely correct sir! It's been some time since I've looked at this code.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Maybe update the example to reflect this change?\u003C\u002Fp>","2020-05-12T10:47:14Z",{"login":470,"avatar_url":471,"html_url":472},{"url":554,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264772\u002Freactions",{"id":556,"html_url":557,"body_html":558,"created_at":559,"updated_at":559,"author_association":468,"user":560,"reactions":561},627264824,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264824","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2017-11-13 09:16:30\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Maybe update the example to reflect this change?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Thanks, have done so!\u003C\u002Fp>","2020-05-12T10:47:21Z",{"login":470,"avatar_url":471,"html_url":472},{"url":562,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264824\u002Freactions",{"id":564,"html_url":565,"body_html":566,"created_at":567,"updated_at":567,"author_association":468,"user":568,"reactions":569},627264876,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264876","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F683fee3347043ac7357d1d9fc3d2babfb4227d3e6f6277eda558daf54908684b\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39373666623336386534613261303035303661343539313964336264633865383f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Bilal\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F683fee3347043ac7357d1d9fc3d2babfb4227d3e6f6277eda558daf54908684b\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39373666623336386534613261303035303661343539313964336264633865383f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Bilal\u003C\u002Fstrong> commented on \u003Cstrong>2019-04-24 12:44:31\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>I want to ask you if I could have the permission to use your code freely.\u003C\u002Fp>","2020-05-12T10:47:28Z",{"login":470,"avatar_url":471,"html_url":472},{"url":570,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264876\u002Freactions",{"id":572,"html_url":573,"body_html":574,"created_at":575,"updated_at":575,"author_association":468,"user":576,"reactions":577},627264922,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264922","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2019-05-03 13:44:09\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>I want to ask you if I could have the permission to use your code freely.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>The code in this post is MIT licensed.\u003C\u002Fp>","2020-05-12T10:47:34Z",{"login":470,"avatar_url":471,"html_url":472},{"url":578,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264922\u002Freactions",{"id":580,"html_url":581,"body_html":582,"created_at":583,"updated_at":583,"author_association":468,"user":584,"reactions":585},627264961,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627264961","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F9f35d5aab51e9d4f95532c1bbf4a148d6829634dcfae051ee328df05f9771126\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38316332656234666261353336373561323162623034363863376534333434393f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Steve Greene\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F9f35d5aab51e9d4f95532c1bbf4a148d6829634dcfae051ee328df05f9771126\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38316332656234666261353336373561323162623034363863376534333434393f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Steve Greene\u003C\u002Fstrong> commented on \u003Cstrong>2019-07-31 19:39:02\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>This \u003Ccode>INotifyPropertyChanged\u003C\u002Fcode> base implementation seems very useful to me - thank you!\u003C\u002Fp>\n\u003Cp>I'm confused about the \u003Ccode>Debug.Assert\u003C\u002Fcode> condition shown:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>||\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetRuntimeProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>!=\u003C\u002Fspan> \u003Cspan>null\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Shouldn't that be like this instead?\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>!\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>&amp;&amp;\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetRuntimeProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>!=\u003C\u002Fspan> \u003Cspan>null\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>But I'm unfamiliar with the actual meaning of \u003Ccode>this.GetType().GetRuntimeProperty(propertyName)\u003C\u002Fcode>, so I'm just confused.\u003C\u002Fp>","2020-05-12T10:47:41Z",{"login":470,"avatar_url":471,"html_url":472},{"url":586,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627264961\u002Freactions",{"id":588,"html_url":589,"body_html":590,"created_at":591,"updated_at":591,"author_association":468,"user":592,"reactions":593},627265003,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F92#issuecomment-627265003","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2019-08-02 16:28:51\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>This \u003Ccode>INotifyPropertyChanged\u003C\u002Fcode> base implementation seems very useful to me - thank you!\u003C\u002Fp>\n\u003Cp>I'm confused about the \u003Ccode>Debug.Assert\u003C\u002Fcode> condition shown:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>||\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetRuntimeProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>!=\u003C\u002Fspan> \u003Cspan>null\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Shouldn't that be like this instead?\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>!\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>&amp;&amp;\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetRuntimeProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>!=\u003C\u002Fspan> \u003Cspan>null\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>But I'm unfamiliar with the actual meaning of \u003Ccode>this.GetType().GetRuntimeProperty(propertyName)\u003C\u002Fcode>, so I'm just confused.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>A null or empty property name is actually valid. It signals that all of the properties on the view model have changed and that they should be refreshed in the XAML bindings.\u003C\u002Fp>","2020-05-12T10:47:48Z",{"login":470,"avatar_url":471,"html_url":472},{"url":594,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627265003\u002Freactions","2014-06-18T00:00:00+00:00",null,"An base class implementation for the INotifyPropertyChanged interface. Used in the Model-View-ViewModel (MVVM) pattern. Targeted for best performance.","md",[600,602,603,604,605,606,607],{"depth":601,"value":171},1,{"depth":601,"value":188},{"depth":601,"value":253},{"depth":601,"value":305},{"depth":601,"value":344},{"depth":601,"value":390},{"depth":601,"value":446},"\u002Fimages\u002Fhero\u002FMVVM-1366x768.png",{},true,"posts\u002F2014\u002Fmodel-view-viewmodel-mvvm-part3-inotifypropertychanged\u002Findex",[613,614,615,616,617,618,619,87,434,620],".NET","Base Class Library","BCL","C#","Design Patterns","Events","Explicit Interface Implementation","Model-View-ViewModel (MVVM)",11,[623,627,631,636,640,643,646,650,654,658,661,665,670,673,676,680,684,686,688,689,693,696,699,704,709,713,716,719,722,727,731,734,739,743,747,751,754,758,762,766,770,774,778,782,785,789,793,797,801,804,808,812,815,818,822,826,831,835,839,843,847,851,855,858,861,864,868,872,875,879,882,885,888,891,895,899,902,905,909,913,916,919,922,926,930,934,938,941,944,949,952,955,959,962,966,970,973,977,980,983,987,991,995],{"title":624,"permalink":625,"heroImage":626,"timeToRead":601},"Just Start - The First Blog Post","\u002Fjust-start-the-first-blog-post\u002F","\u002Fimages\u002Fhero\u002FJust-Start-1366x768.png",{"title":628,"permalink":629,"heroImage":630,"timeToRead":455},"ConfigureAwait in Task Parallel Library (TPL)","\u002Fconfigureawait-task-parallel-library\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-.NET-1366x768.png",{"title":632,"permalink":633,"heroImage":634,"timeToRead":635},"Stop The Brace Wars, Use StyleCop","\u002Fstop-brace-wars-use-stylecop\u002F","\u002Fimages\u002Fhero\u002FStyleCop-1366x768.png",3,{"title":637,"permalink":96,"heroImage":638,"timeToRead":639},"Reactive Extensions (Rx) - Part 1 - Replacing C# Events","\u002Fimages\u002Fhero\u002FReactive-Extensions-1366x768.png",4,{"title":641,"permalink":642,"heroImage":638,"timeToRead":635},"Reactive Extensions (Rx) - Part 2 - Wrapping C# Events","\u002Freactive-extensions-part2-wrapping-events\u002F",{"title":644,"permalink":645,"heroImage":638,"timeToRead":455},"Reactive Extensions (Rx) - Part 3 - Naming Conventions","\u002Freactive-extensions-part3-naming-conventions\u002F",{"title":647,"permalink":648,"heroImage":649,"timeToRead":635},"WPF Metro Part 1 - Modern UI for WPF","\u002Fwpf-metro-part1-modern-ui-for-wpf\u002F","\u002Fimages\u002Fhero\u002FModern-UI-for-WPF-1366x768.png",{"title":651,"permalink":652,"heroImage":653,"timeToRead":635},"WPF Metro Part 2 - MahApps Metro","\u002Fwpf-metro-part2-mahapps-metro\u002F","\u002Fimages\u002Fhero\u002FMahApps-Metro-1366x768.png",{"title":655,"permalink":656,"heroImage":657,"timeToRead":635},"Windows 8.1 TouchScreen Gaming Laptops","\u002Fwindows-8-touchscreen-gaming-laptops\u002F","\u002Fimages\u002Fhero\u002FFry-Shutup-And-Take-My-Money-1366x768.png",{"title":659,"permalink":660,"heroImage":638,"timeToRead":635},"Reactive Extensions (Rx) - Part 4 - Replacing Timers","\u002Freactive-extensions-part4-replacing-timers\u002F",{"title":662,"permalink":663,"heroImage":664,"timeToRead":455},"WPF Metro Part 3 - Elysium","\u002Fwpf-metro-part3-elysium\u002F","\u002Fimages\u002Fhero\u002FElysium-1366x768.png",{"title":666,"permalink":667,"heroImage":668,"timeToRead":669},"WPF Metro Part 4 - Elysium Extra","\u002Fwpf-metro-part4-elysium-extra\u002F","\u002Fimages\u002Fhero\u002FElysium-Extra-1366x768.png",8,{"title":671,"permalink":672,"heroImage":638,"timeToRead":639},"Reactive Extensions (Rx) - Part 5 - Awaiting Observables","\u002Freactive-extensions-part5-awaiting-observables\u002F",{"title":674,"permalink":675,"heroImage":630,"timeToRead":669},"GetHashCode Made Easy","\u002Fgethashcode-made-easy\u002F",{"title":677,"permalink":678,"heroImage":638,"timeToRead":679},"Reactive Extensions (Rx) - Part 6 - Task ToObservable","\u002Freactive-extensions-part6-task-toobservable\u002F",5,{"title":681,"permalink":682,"heroImage":683,"timeToRead":601},"Portable Class Library (PCL) version of NotificationsExtensions NuGet package","\u002Fportable-class-library-version-of-notificationsextensions-nuget-package\u002F","\u002Fimages\u002Fhero\u002FNuGet-1366x768.png",{"title":685,"permalink":55,"heroImage":608,"timeToRead":679},"Model-View-ViewModel (MVVM) - Part 1 - Overview",{"title":687,"permalink":61,"heroImage":608,"timeToRead":639},"Model-View-ViewModel (MVVM) - Part 2 - IDisposable",{"title":41,"permalink":67,"heroImage":608,"timeToRead":621},{"title":690,"permalink":691,"heroImage":692,"timeToRead":635},"Naming Conventions","\u002Fnaming-conventions\u002F","\u002Fimages\u002Fhero\u002FNaming-Conventions-1366x768.png",{"title":694,"permalink":73,"heroImage":608,"timeToRead":695},"Model-View-ViewModel (MVVM) - Part 4 - INotifyDataErrorInfo",12,{"title":697,"permalink":698,"heroImage":668,"timeToRead":639},"Elysium Extra 1.1 Released","\u002Felysium-extra-1-1-released\u002F",{"title":700,"permalink":701,"heroImage":702,"timeToRead":703},"ASP.NET Core Boilerplate","\u002Fasp-net-mvc-boilerplate\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Boilerplate-1366x768.png",7,{"title":705,"permalink":706,"heroImage":707,"timeToRead":708},"Internet Favicon Madness (Updated)","\u002Finternet-favicon-madness\u002F","\u002Fimages\u002Fhero\u002FFavicons-1366x768.png",17,{"title":710,"permalink":711,"heroImage":712,"timeToRead":703},"Custom Visual Studio Project Templates","\u002Fcustom-visual-studio-project-templates\u002F","\u002Fimages\u002Fhero\u002FVisual-Studio-1366x768.png",{"title":714,"permalink":715,"heroImage":712,"timeToRead":635},"Configuration File Transforms In Visual Studio Should Be Built In","\u002Fconfiguration-file-transforms-in-visual-studio-should-be-built-in\u002F",{"title":717,"permalink":718,"heroImage":702,"timeToRead":621},"Securing the ASP.NET MVC Web.config","\u002Fsecuring-the-aspnet-mvc-web-config\u002F",{"title":720,"permalink":721,"heroImage":638,"timeToRead":455},"Reactive Extensions (Rx) - Part 7 - Sample Events","\u002Freactive-extensions-part7-sample-events\u002F",{"title":723,"permalink":724,"heroImage":725,"timeToRead":726},"NWebSec ASP.NET MVC Security Through HTTP Headers","\u002Fnwebsec-asp-net-mvc-security-through-http-headers\u002F","\u002Fimages\u002Fhero\u002FNWebSec-1366x768.png",6,{"title":728,"permalink":729,"heroImage":730,"timeToRead":164},"Content Security Policy (CSP) for ASP.NET MVC","\u002Fcontent-security-policy-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FContent-Security-Policy-CSP-for-ASP.NET-MVC-1366x768.png",{"title":732,"permalink":733,"heroImage":630,"timeToRead":679},"C# 6.0 - Saving Developers From Themselves","\u002Fc-6-0-saving-developers-from-themselves\u002F",{"title":735,"permalink":736,"heroImage":737,"timeToRead":738},"Building RSS\u002FAtom Feeds for ASP.NET MVC","\u002Fbuilding-rssatom-feeds-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FRSS-And-Atom-1366x768.png",19,{"title":740,"permalink":741,"heroImage":742,"timeToRead":621},"Canonical URL's for ASP.NET MVC","\u002Fcanonical-urls-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FLink-Juice-1366x768.png",{"title":744,"permalink":745,"heroImage":746,"timeToRead":639},"Dynamically Generating Robots.txt Using ASP.NET MVC","\u002Fdynamically-generating-robots-txt-using-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FRobots.txt-1366x768.jpg",{"title":748,"permalink":749,"heroImage":750,"timeToRead":639},"Minifying HTML for ASP.NET MVC","\u002Fminifying-html-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FThe-Internet-Is-A-Series-Of-Tubes-1366x768.jpg",{"title":752,"permalink":753,"heroImage":702,"timeToRead":455},"Whats New in ASP.NET Core Boilerplate","\u002Fwhats-new-in-asp-net-5-mvc-6-boilerplate\u002F",{"title":755,"permalink":756,"heroImage":757,"timeToRead":703},"Dynamically Generating Sitemap.xml for ASP.NET MVC","\u002Fdynamically-generating-sitemap-xml-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FSitemaps-1366x768.png",{"title":759,"permalink":760,"heroImage":761,"timeToRead":455},"So I've Been Awarded Microsoft MVP Status!","\u002Fso-ive-been-awarded-microsoft-mvp-status\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-MVP-1366x768.png",{"title":763,"permalink":764,"heroImage":765,"timeToRead":601},".NET Big-O Algorithm Complexity Cheat Sheet","\u002Fnet-big-o-algorithm-complexity-cheat-sheet\u002F","\u002Fimages\u002Fhero\u002FNET-Big-O-Algorithm-Complexity-Cheat-Sheet-1366x768.jpg",{"title":767,"permalink":768,"heroImage":769,"timeToRead":635},"Logging with Serilog.Exceptions","\u002Flogging-with-serilog-exceptions\u002F","\u002Fimages\u002Fhero\u002FSerilog.Exceptions-1366x768.png",{"title":771,"permalink":772,"heroImage":773,"timeToRead":601},"Make Certificate","\u002Fmake-certificate\u002F","\u002Fimages\u002Fhero\u002FMake-Certificate-1366x768.png",{"title":775,"permalink":776,"heroImage":777,"timeToRead":455},"Colorful.Console","\u002Fcolorful-console\u002F","\u002Fimages\u002Fhero\u002FColorful.Console-1366x768.png",{"title":779,"permalink":780,"heroImage":781,"timeToRead":635},"Subresource Integrity TagHelper Using ASP.NET Core - Part 1","\u002Fsubresource-integrity-taghelper-using-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FMake-Security-Easy-1366x768.png",{"title":783,"permalink":784,"heroImage":781,"timeToRead":639},"Subresource Integrity TagHelper Using ASP.NET Core - Part 2","\u002Fsubresource-integrity-taghelper-using-asp-net-core-part-2\u002F",{"title":786,"permalink":787,"heroImage":788,"timeToRead":679},"Social TagHelpers for ASP.NET Core","\u002Fsocial-taghelpers-for-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSocial-Media-1366x768.png",{"title":790,"permalink":791,"heroImage":792,"timeToRead":726},"Azure Active Directory Versus Identity Server","\u002Fazure-active-directory-versus-identity-server\u002F","\u002Fimages\u002Fhero\u002FAzure-Active-Directory-Versus-Identity-Server-1366x768.png",{"title":794,"permalink":795,"heroImage":796,"timeToRead":455},"ASP.NET Core Fluent Interface Extensions","\u002Fasp-net-core-fluent-interface-extensions\u002F","\u002Fimages\u002Fhero\u002FFluent-Interface-All-The-Things-1366x768.png",{"title":798,"permalink":799,"heroImage":800,"timeToRead":621},"NGINX for ASP.NET Core In-Depth","\u002Fnginx-asp-net-core-depth\u002F","\u002Fimages\u002Fhero\u002FNGINX-1366x768.png",{"title":802,"permalink":803,"heroImage":630,"timeToRead":455},"The Dotnet Watch Tool","\u002Fthe-dotnet-watch-tool\u002F",{"title":805,"permalink":806,"heroImage":807,"timeToRead":639},"Making Application Insights Fast & Secure","\u002Fmaking-application-insights-fast-and-secure\u002F","\u002Fimages\u002Fhero\u002FApplication-Insights-1366x768.png",{"title":809,"permalink":810,"heroImage":811,"timeToRead":703},"SEO Friendly URL's for ASP.NET Core","\u002Fseo-friendly-urls-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSearch-Engine-Optimization-SEO-1366x768.png",{"title":813,"permalink":814,"heroImage":638,"timeToRead":601},"Reactive Extensions (Rx) - Part 8 - Timeouts","\u002Freactive-extensions-rx-part-8-timeouts\u002F",{"title":816,"permalink":817,"heroImage":630,"timeToRead":639},"Custom Project Templates Using dotnet new","\u002Fcustom-project-templates-using-dotnet-new\u002F",{"title":819,"permalink":820,"heroImage":821,"timeToRead":669},"Cross-Platform DevOps for .NET Core","\u002Fcross-platform-devops-net-core\u002F","\u002Fimages\u002Fhero\u002FDotnet-Cake-AppVeyor-Travis-1366x768.png",{"title":823,"permalink":824,"heroImage":825,"timeToRead":703},"Cleaning Up CSPROJ","\u002Fcleaning-up-csproj\u002F","\u002Fimages\u002Fhero\u002FCleaning-Up-CSPROJ-1366x768.png",{"title":827,"permalink":828,"heroImage":829,"timeToRead":830},"dotnet new Feature Selection","\u002Fdotnet-new-feature-selection\u002F","\u002Fimages\u002Fhero\u002FWho-Wants-To-Be-A-Millionaire-1366x768.png",9,{"title":832,"permalink":833,"heroImage":834,"timeToRead":639},"ASP.NET Core Lazy Command Pattern","\u002Fasp-net-core-lazy-command-pattern\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Lazy-Command-Pattern-1366x768.png",{"title":836,"permalink":837,"heroImage":838,"timeToRead":455},"Structured Data using Schema.NET","\u002Fstructured-data-using-schema-net\u002F","\u002Fimages\u002Fhero\u002FSchema.NET-1366x768.png",{"title":840,"permalink":841,"heroImage":842,"timeToRead":726},"Keeping Up With Software Development","\u002Fkeeping-software-development\u002F","\u002Fimages\u002Fhero\u002FKeeping-up-with-Software-Development-1366x768.png",{"title":844,"permalink":845,"heroImage":846,"timeToRead":455},"A Very Generic .editorconfig File (Updated)","\u002Fgeneric-editorconfig-file\u002F","\u002Fimages\u002Fhero\u002FA-Very-Generic-Editorconfig-File-1366x768.png",{"title":848,"permalink":849,"heroImage":850,"timeToRead":679},"ASP.NET Core Caching in Practice","\u002Fasp-net-core-caching-in-practice\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Caching-in-Practice-1366x768.png",{"title":852,"permalink":853,"heroImage":854,"timeToRead":601},"Docker Read-Only File Systems","\u002Fdocker-read-file-systems\u002F","\u002Fimages\u002Fhero\u002FDocker-1366x768.png",{"title":856,"permalink":857,"heroImage":854,"timeToRead":635},"Docker Labels in Depth","\u002Fdocker-labels-depth\u002F",{"title":859,"permalink":860,"heroImage":854,"timeToRead":639},"Useful Docker Images - Part 1","\u002Fuseful-docker-images-part1\u002F",{"title":862,"permalink":863,"heroImage":854,"timeToRead":679},"Useful Docker Images - Part 2","\u002Fuseful-docker-images-part2\u002F",{"title":865,"permalink":866,"heroImage":867,"timeToRead":639},"Writing your Webpack configuration in TypeScript","\u002Fwriting-your-webpack-configuration-in-typescript\u002F","\u002Fimages\u002Fhero\u002FTypeScript-1366x768.png",{"title":869,"permalink":870,"heroImage":871,"timeToRead":679},"Writing Code while Asleep","\u002Fwriting-code-asleep\u002F","\u002Fimages\u002Fhero\u002FWhile-Alive-Eat-Sleep-Code-Repeat-1366x768.png",{"title":873,"permalink":874,"heroImage":630,"timeToRead":455},"The Dotnet Watch Tool Revisited","\u002Fthe-dotnet-watch-tool-revisited\u002F",{"title":876,"permalink":877,"heroImage":878,"timeToRead":455},".NET Boxed","\u002Fnet-boxed\u002F","\u002Fimages\u002Fhero\u002FDotnet-Boxed-1366x768.png",{"title":880,"permalink":881,"heroImage":630,"timeToRead":455},"Migrating to Entity Framework Core Seed Data","\u002Fmigrating-to-entity-framework-core-seed-data\u002F",{"title":883,"permalink":884,"heroImage":630,"timeToRead":635},"Optimally Configuring Entity Framework Core","\u002Foptimally-configuring-entity-framework-core\u002F",{"title":886,"permalink":887,"heroImage":630,"timeToRead":601},"ASP.NET Core Hidden Gem - QueryHelpers","\u002Fasp-net-core-hidden-gem-queryhelpers\u002F",{"title":889,"permalink":890,"heroImage":630,"timeToRead":830},"Optimally Configuring ASP.NET Core HttpClientFactory","\u002Foptimally-configuring-asp-net-core-httpclientfactory\u002F",{"title":892,"permalink":893,"heroImage":894,"timeToRead":703},"PluralSight vs LinkedIn Learning vs FrontendMasters vs Egghead.io vs YouTube","\u002Fpluralsight-vs-linkedin-learning-vs-frontendmasters-vs-egghead-io-vs-youtube\u002F","\u002Fimages\u002Fhero\u002FOnline-Learning-1366x768.png",{"title":896,"permalink":897,"heroImage":898,"timeToRead":830},"Is ASP.NET Core now a Mature Platform?","\u002Fis-asp-net-core-now-a-mature-platform\u002F","\u002Fimages\u002Fhero\u002FRocket-1366x768.jpg",{"title":900,"permalink":901,"heroImage":878,"timeToRead":830},"A Simple and Fast Object Mapper","\u002Fa-simple-and-fast-object-mapper\u002F",{"title":903,"permalink":904,"heroImage":854,"timeToRead":601},"Securing ASP.NET Core in Docker","\u002Fsecuring-asp-net-core-in-docker\u002F",{"title":906,"permalink":907,"heroImage":908,"timeToRead":639},"Git Cloning the Windows OS Repo","\u002Fgit-cloning-the-windows-os-repo\u002F","\u002Fimages\u002Fhero\u002FWindows-1366x768.png",{"title":910,"permalink":911,"heroImage":912,"timeToRead":703},".gitattributes Best Practices","\u002Fgitattributes-best-practices\u002F","\u002Fimages\u002Fhero\u002FGit-1366x768.png",{"title":914,"permalink":915,"heroImage":630,"timeToRead":635},"Unit Testing dotnet new Templates","\u002Funit-testing-dotnet-new-templates\u002F",{"title":917,"permalink":918,"heroImage":878,"timeToRead":679},"What dotnet new Could Be","\u002Fwhat-dotnet-new-could-be\u002F",{"title":920,"permalink":921,"heroImage":630,"timeToRead":639},"ASP.NET Core Integration Testing & Mocking using Moq","\u002Fasp-net-core-integration-testing-mocking-using-moq\u002F",{"title":923,"permalink":924,"heroImage":925,"timeToRead":703},"Choosing a Static Site Generator","\u002Fchoosing-a-static-site-generator\u002F","\u002Fimages\u002Fhero\u002FStatic-Site-Generators-1600x900.png",{"title":927,"permalink":928,"heroImage":929,"timeToRead":455},"Spicing up your Browser Console","\u002Fspicing-up-your-browser-console\u002F","\u002Fimages\u002Fhero\u002FFiglet-Fonts-1600x900.png",{"title":931,"permalink":932,"heroImage":933,"timeToRead":679},"Racism in Software Development & Beyond","\u002Fracism-in-software-development-and-beyond\u002F","\u002Fimages\u002Fhero\u002FBlack-Glowing-Fist-1600x900.png",{"title":935,"permalink":936,"heroImage":937,"timeToRead":679},"The Easiest Way to Version NuGet Packages","\u002Fthe-easiest-way-to-version-nuget-packages\u002F","\u002Fimages\u002Fhero\u002FSemantic-Versioning-1600x900.png",{"title":939,"permalink":940,"heroImage":683,"timeToRead":726},"The Fastest NuGet Package Ever Published (Probably)","\u002Fthe-fastest-nuget-package-ever-published-probably\u002F",{"title":942,"permalink":943,"heroImage":630,"timeToRead":635},"Automating .NET Security Updates","\u002Fautomating-dotnet-security-updates\u002F",{"title":945,"permalink":946,"heroImage":947,"timeToRead":948},"Deep Dive into Open Telemetry for .NET","\u002Fdeep-dive-into-open-telemetry-for-net\u002F","\u002Fimages\u002Fhero\u002FOpen-Telemetry-1600x900.png",10,{"title":950,"permalink":951,"heroImage":947,"timeToRead":635},"Open Telemetry for ASP.NET Core","\u002Fopen-telemetry-for-asp-net-core\u002F",{"title":953,"permalink":954,"heroImage":947,"timeToRead":635},"Exporting Open Telemetry Data to Jaeger","\u002Fexporting-open-telemetry-data-to-jaeger\u002F",{"title":956,"permalink":957,"heroImage":958,"timeToRead":635},"A System for Grouping & Sorting CSS Properties","\u002Fsystem-for-grouping-and-sorting-css-properties\u002F","\u002Fimages\u002Fhero\u002FCSS-1600x900.png",{"title":960,"permalink":961,"heroImage":958,"timeToRead":726},"CSS General Rules of Thumb","\u002Fcss-general-rules-of-thumb\u002F",{"title":963,"permalink":964,"heroImage":965,"timeToRead":639},"Web Component Custom Element Gotchas","\u002Fweb-component-custom-element-gotchas\u002F","\u002Fimages\u002Fhero\u002FWeb-Components-1600x900.png",{"title":967,"permalink":968,"heroImage":969,"timeToRead":455},"Code Coverage & Frontend Testing","\u002Fcode-coverage-and-frontend-testing\u002F","\u002Fimages\u002Fhero\u002FJest-Cypress-1600x900.png",{"title":971,"permalink":972,"heroImage":712,"timeToRead":601},".NET Boxed Visual Studio Integration","\u002Fdotnet-boxed-visual-studio-integration\u002F",{"title":974,"permalink":975,"heroImage":976,"timeToRead":635},"The Windows Package Manager","\u002Fwindows-package-manager\u002F","\u002Fimages\u002Fhero\u002FWinget-1600x900.png",{"title":978,"permalink":979,"heroImage":630,"timeToRead":635},"The Problem with C# 10 Implicit Usings","\u002Fthe-problem-with-csharp-10-implicit-usings\u002F",{"title":981,"permalink":982,"heroImage":947,"timeToRead":639},"Optimally Configuring Open Telemetry Tracing for ASP.NET Core","\u002Foptimally-configuring-open-telemetry-tracing-for-asp-net-core\u002F",{"title":984,"permalink":985,"heroImage":986,"timeToRead":455},"Live Streaming .NET","\u002Flive-streaming-dotnet\u002F","\u002Fimages\u002Fhero\u002FMy-YouTube-1920x1080.jpg",{"title":988,"permalink":989,"heroImage":990,"timeToRead":455},"I Was Awarded as an Open UK Honouree","\u002Fopen-uk-honouree\u002F","\u002Fimages\u002Fhero\u002FOpen-UK-Honours-1366x768.jpg",{"title":992,"permalink":993,"heroImage":994,"timeToRead":639},"On the Etiquette of Pull Request Comments","\u002Fon-the-etiquette-of-pull-request-comments\u002F","\u002Fimages\u002Fhero\u002FPrecious-PR-1600x900.jpg",{"title":996,"permalink":997,"heroImage":998,"timeToRead":601},"AI Gone Rogue","\u002Fai-gone-rogue\u002F","\u002Fimages\u002Fhero\u002FHAL-9000-Prop-1600x900.png",{"left":4,"top":4,"width":26,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":1000},"\u003Cpath fill=\"currentColor\" d=\"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.55 96.55 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.3 96.3 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96s-42.981-96-96-96\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":1002},"\u003Cpath fill=\"currentColor\" d=\"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48c27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":1004},"\u003Cpath fill=\"currentColor\" d=\"M459.37 151.716c.325 4.548.325 9.097.325 13.645c0 138.72-105.583 298.558-298.558 298.558c-59.452 0-114.68-17.219-161.137-47.106c8.447.974 16.568 1.299 25.34 1.299c49.055 0 94.213-16.568 130.274-44.832c-46.132-.975-84.792-31.188-98.112-72.772c6.498.974 12.995 1.624 19.818 1.624c9.421 0 18.843-1.3 27.614-3.573c-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319c-28.264-18.843-46.781-51.005-46.781-87.391c0-19.492 5.197-37.36 14.294-52.954c51.655 63.675 129.3 105.258 216.365 109.807c-1.624-7.797-2.599-15.918-2.599-24.04c0-57.828 46.782-104.934 104.934-104.934c30.213 0 57.502 12.67 76.67 33.137c23.715-4.548 46.456-13.32 66.599-25.34c-7.798 24.366-24.366 44.833-46.132 57.827c21.117-2.273 41.584-8.122 60.426-16.243c-14.292 20.791-32.161 39.308-52.628 54.253\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":1006},"\u003Cpath fill=\"currentColor\" d=\"M201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6c0-13.8 11.1-24.9 24.9-24.9c13.6 0 24.6 11.1 24.6 24.9c0 13.6-11.1 24.6-24.6 24.6M504 256c0 137-111 248-248 248S8 393 8 256S119 8 256 8s248 111 248 248m-132.3-41.2c-9.4 0-17.7 3.9-23.8 10c-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3l55.4 12.5c0 13.6 11.1 24.6 24.6 24.6c13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8c-6.1-6.4-14.7-10.2-24.1-10.2c-34.9 0-46.3 46.9-14.4 62.8c-1.1 5-1.7 10.2-1.7 15.5c0 52.6 59.2 95.2 132 95.2c73.1 0 132.3-42.6 132.3-95.2c0-5.3-.6-10.8-1.9-15.8c31.3-16 19.8-62.5-14.9-62.5M302.8 331c-18.2 18.2-76.1 17.9-93.6 0c-2.2-2.2-6.1-2.2-8.3 0c-2.5 2.5-2.5 6.4 0 8.6c22.8 22.8 87.3 22.8 110.2 0c2.5-2.2 2.5-6.1 0-8.6c-2.2-2.2-6.1-2.2-8.3 0m7.7-75c-13.6 0-24.6 11.1-24.6 24.9c0 13.6 11.1 24.6 24.6 24.6c13.8 0 24.9-11.1 24.9-24.6c0-13.8-11-24.9-24.9-24.9\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":1008},"\u003Cpath fill=\"currentColor\" d=\"M512 194.8c0 101.3-82.4 183.8-183.8 183.8c-101.7 0-184.4-82.4-184.4-183.8c0-101.6 82.7-184.3 184.4-184.3C429.6 10.5 512 93.2 512 194.8M0 501.5h90v-491H0z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1010},"\u003Cpath fill=\"currentColor\" d=\"m20.216 6.415l-.132-.666c-.119-.598-.388-1.163-1.001-1.379c-.197-.069-.42-.098-.57-.241c-.152-.143-.196-.366-.231-.572c-.065-.378-.125-.756-.192-1.133c-.057-.325-.102-.69-.25-.987c-.195-.4-.597-.634-.996-.788a6 6 0 0 0-.626-.194c-1-.263-2.05-.36-3.077-.416a26 26 0 0 0-3.7.062c-.915.083-1.88.184-2.75.5c-.318.116-.646.256-.888.501c-.297.302-.393.77-.177 1.146c.154.267.415.456.692.58c.36.162.737.284 1.123.366c1.075.238 2.189.331 3.287.37q1.829.074 3.65-.118q.449-.05.896-.119c.352-.054.578-.513.474-.834c-.124-.383-.457-.531-.834-.473c-.466.074-.96.108-1.382.146q-1.767.12-3.536.006a22 22 0 0 1-1.157-.107c-.086-.01-.18-.025-.258-.036q-.364-.055-.724-.13c-.111-.027-.111-.185 0-.212h.005q.416-.09.838-.147h.002c.131-.009.263-.032.394-.048a25 25 0 0 1 3.426-.12q1.011.029 2.017.144l.228.031q.4.06.798.145c.392.085.895.113 1.07.542c.055.137.08.288.111.431l.319 1.484a.237.237 0 0 1-.199.284h-.003l-.112.015a37 37 0 0 1-4.743.295a37 37 0 0 1-4.699-.304c-.14-.017-.293-.042-.417-.06c-.326-.048-.649-.108-.973-.161c-.393-.065-.768-.032-1.123.161c-.29.16-.527.404-.675.701c-.154.316-.199.66-.267 1c-.069.34-.176.707-.135 1.056c.087.753.613 1.365 1.37 1.502a39.7 39.7 0 0 0 11.343.376a.483.483 0 0 1 .535.53l-.071.697l-1.018 9.907c-.041.41-.047.832-.125 1.237c-.122.637-.553 1.028-1.182 1.171q-.868.197-1.756.205c-.656.004-1.31-.025-1.966-.022c-.699.004-1.556-.06-2.095-.58c-.475-.458-.54-1.174-.605-1.793l-.731-7.013l-.322-3.094c-.037-.351-.286-.695-.678-.678c-.336.015-.718.3-.678.679l.228 2.185l.949 9.112c.147 1.344 1.174 2.068 2.446 2.272c.742.12 1.503.144 2.257.156c.966.016 1.942.053 2.892-.122c1.408-.258 2.465-1.198 2.616-2.657l1.024-9.995l.215-2.087a.48.48 0 0 1 .39-.426c.402-.078.787-.212 1.074-.518c.455-.488.546-1.124.385-1.766zm-1.478.772c-.145.137-.363.201-.578.233c-2.416.359-4.866.54-7.308.46c-1.748-.06-3.477-.254-5.207-.498c-.17-.024-.353-.055-.47-.18c-.22-.236-.111-.71-.054-.995c.052-.26.152-.609.463-.646c.484-.057 1.046.148 1.526.22q.865.132 1.737.212c2.48.226 5.002.19 7.472-.14q.675-.09 1.345-.21c.399-.072.84-.206 1.08.206c.166.281.188.657.162.974a.54.54 0 0 1-.169.364zm-6.159 3.9c-.862.37-1.84.788-3.109.788a6 6 0 0 1-1.569-.217l.877 9.004c.065.78.717 1.38 1.5 1.38c0 0 1.243.065 1.658.065c.447 0 1.786-.065 1.786-.065c.783 0 1.434-.6 1.499-1.38l.94-9.95a4 4 0 0 0-1.322-.238c-.826 0-1.491.284-2.26.613\"\u002F>",{"left":4,"top":4,"width":29,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":1012},"\u003Cpath fill=\"currentColor\" d=\"M111.4 295.9c-3.5 19.2-17.4 108.7-21.5 134c-.3 1.8-1 2.5-3 2.5H12.3c-7.6 0-13.1-6.6-12.1-13.9L58.8 46.6c1.5-9.6 10.1-16.9 20-16.9c152.3 0 165.1-3.7 204 11.4c60.1 23.3 65.6 79.5 44 140.3c-21.5 62.6-72.5 89.5-140.1 90.3c-43.4.7-69.5-7-75.3 24.2M357.1 152c-1.8-1.3-2.5-1.8-3 1.3c-2 11.4-5.1 22.5-8.8 33.6c-39.9 113.8-150.5 103.9-204.5 103.9c-6.1 0-10.1 3.3-10.9 9.4c-22.6 140.4-27.1 169.7-27.1 169.7c-1 7.1 3.5 12.9 10.6 12.9h63.5c8.6 0 15.7-6.3 17.4-14.9c.7-5.4-1.1 6.1 14.4-91.3c4.6-22 14.3-19.7 29.3-19.7c71 0 126.4-28.8 142.9-112.3c6.5-34.8 4.6-71.4-23.8-92.6\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":1014},"\u003Cpath fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8m0 448c-110.532 0-200-89.431-200-200c0-110.495 89.472-200 200-200c110.491 0 200 89.471 200 200c0 110.53-89.431 200-200 200m107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516c17.561-9.845 28.324-16.541 28.324-29.579c0-17.246-21.999-28.693-39.784-28.693c-23.189 0-33.894 10.977-48.942 29.969c-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8M298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42s18.841-42 42-42s42 18.841 42 42\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1016},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 12H5m7 7l-7-7l7-7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1018},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",1793207064930]