[{"data":1,"prerenderedAt":895},["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-part4-inotifydataerrorinfo\u002F":39,"i-fa-solid:share-alt":879,"i-fa-brands:facebook":881,"i-fa-brands:twitter":883,"i-fa-brands:reddit":885,"i-fa-brands:patreon":887,"i-simple-icons:buymeacoffee":889,"i-fa-brands:paypal":891,"i-fa-regular:question-circle":893},{"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":417,"date":853,"dateModified":854,"description":855,"extension":856,"headings":857,"heroImage":866,"meta":867,"path":73,"permalink":73,"published":868,"stem":869,"tags":870,"timeToRead":878},"posts\u002Fposts\u002F2014\u002Fmodel-view-viewmodel-mvvm-part4-inotifydataerrorinfo\u002Findex.md","Model-View-ViewModel (MVVM) - Part 4 - INotifyDataErrorInfo","Muhammad Rehan Saeed",{"type":44,"value":45,"toc":414},"minimark",[46,75,93,103,119,125,135,144,167,182,189,195,224,227,230,241,244,247,258,269,287,298,308,319,326,338,354,365,376,387,393,404,410],[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,92],"p",{},"In this next part, I'm going to discuss validation of your view models using the ",[53,80,87],{"href":81,"rel":82,"target":86},"http:\u002F\u002Fmsdn.microsoft.com\u002Fen-us\u002Flibrary\u002Fsystem.componentmodel.inotifydataerrorinfo%28v=vs.110%29.aspx",[83,84,85],"nofollow","noopener","noreferrer","_blank","INotifyDataErrorInfo"," interface. Validation is an often ignored part of the Model-View-ViewModel (MVVM) story. If you need to create a form for your users to fill in (which is probably most applications, I would have thought), then you probably need to validate user input in some way and the ",[53,90,87],{"href":81,"rel":91,"target":86},[83,84,85]," interface can get you there.",[76,94,95],{},[96,97],"img",{"alt":98,"src":99,"width":100,"height":101,"loading":102},"INotifyDataErrorInfo Valid TextBox","\u002Fcontent-images\u002Fposts\u002F2014\u002Fmodel-view-viewmodel-mvvm-part4-inotifydataerrorinfo\u002Fimages\u002FValid.png",250,80,"lazy",[76,104,105,106,110,111,115,116,118],{},"That was a ",[107,108,109],"strong",{},"valid"," ",[112,113,114],"code",{},"TextBox"," using ",[112,117,87],{},".",[76,120,121],{},[96,122],{"alt":123,"src":124,"width":100,"height":101,"loading":102},"INotifyDataErrorInfo Invalid TextBox","\u002Fcontent-images\u002Fposts\u002F2014\u002Fmodel-view-viewmodel-mvvm-part4-inotifydataerrorinfo\u002Fimages\u002FInvalid.png",[76,126,127,128,110,131,115,133,118],{},"That was an ",[107,129,130],{},"invalid",[112,132,114],{},[112,134,87],{},[76,136,137,138,143],{},"In the example above you can see a name text box which requires text, to be in a valid state. In the valid state there is a big green tick next to the text box and conversely in an invalid state, there is a big yellow warning sign, the text box background becomes pink and you get a nice tool-tip telling you what the error is. By the way, this example is taken from my ",[53,139,142],{"href":140,"rel":141,"target":86},"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002FElysium-Extra",[83,84,85],"Elysium Extra"," WPF project which is freely available on GitHub.",[145,146,148,166],"h1",{"id":147},"how-does-it-work",[53,149,152],{"href":150,"aria-hidden":151},"#how-does-it-work","true",[153,154,160],"svg",{"xmlns":155,"xmlns:xlink":156,"viewBox":157,"version":158,"width":159,"height":159,"aria-hidden":151},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxlink","0 0 16 16","1.1",22,[161,162],"path",{"fill":163,"fill-rule":164,"d":165},"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","How Does It Work?",[76,168,169,170,173,174,177,178,181],{},"You can see the interface and its corresponding event arguments below. If the name property in our view model changes and is empty then the state of our view model is invalid, we can raise the ",[112,171,172],{},"ErrorsChanged"," event, set the ",[112,175,176],{},"HasErrors"," property to return true and make any calls to ",[112,179,180],{},"GetErrors"," return a list of the errors (In our case we only have one but there could be multiple errors).",[183,184],"pre",{"className":185,"language":186,"meta":187,"style":187,"html":188},"language-cs shiki shiki-themes light-plus monokai","cs","","\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">namespace\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> System\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=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> interface\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> INotifyDataErrorInfo\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">    {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> HasErrors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> { \u003C\u002Fspan>\u003Cspan class=\"s4J9F\">get\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">; }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s4J9F\">        event\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> EventHandler\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">DataErrorsChangedEventArgs\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ErrorsChanged\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\">        IEnumerable\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> GetErrors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\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 class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> DataErrorsChangedEventArgs\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">EventArgs\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=\"sWm5y\"> DataErrorsChangedEventArgs\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\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=\"sJvqV\">        public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> PropertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> { \u003C\u002Fspan>\u003Cspan class=\"s4J9F\">get\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,190,191,192,194],{},"That's a fair amount of work and a base class to do all that makes life much easier. So what are the main aims of a base class implementing ",[112,193,87],{},"?",[196,197,198,209,212,218,221],"ul",{},[50,199,200,201,204,205,208],{},"Integration - I usually want to raise an error in response to a property changing. So, we probably want to also implement ",[112,202,203],{},"INotifyPropertyChanged",". Handily, I showed how best to create a base class for that in my last article in this series. So our new base class can inherit from the ",[112,206,207],{},"NotifyPropertyChanges"," base class.",[50,210,211],{},"Performance - Performance is king. It needs to be fast and I mean really fast. You can't afford for your UI to freeze up while your view model works out if it has an error to raise or not. Some validation frameworks use an attribute based approach but this requires reflection so we will not be using that here.",[50,213,214,215,217],{},"Reactive Extensions (Rx) - Events are old school, I want an observable error changed event notification system instead of the ",[112,216,172],{}," C# event.",[50,219,220],{},"Human Error - I don't want to raise error change events for properties that don't exist by accident.",[50,222,223],{},"Has it Really Error'ed - I don't want to raise a error changed event twice by accident or if it has not really error'ed.",[76,225,226],{},"So, without further ado, here is my implementation. Note that there are three classes:",[183,228],{"className":185,"language":186,"meta":187,"style":187,"html":229},"\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\">Collections\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\">Collections\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Generic\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\">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\">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 class=\"smL5M\">    using\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> Framework\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ComponentModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Rules\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 Provides functionality to provide errors for the object if it is in an invalid state.\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\">\"T\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The type of this instance.\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=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> abstract\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> NotifyDataErrorInfo\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">NotifyPropertyChanges\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sw29p\">INotifyDataErrorInfo\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        where\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">NotifyDataErrorInfo\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;\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\"> const\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> HasErrorsPropertyName\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"swiDo\"> \"HasErrors\"\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\">        private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> static\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> RuleCollection\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">rules\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> RuleCollection\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        private\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> Dictionary\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sw29p\">List\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\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 the validation errors have changed for a property or for the entire object. \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\"> EventHandler\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">DataErrorsChangedEventArgs\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sw29p\">INotifyDataErrorInfo\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">ErrorsChanged\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\">errorsChanged\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\">errorsChanged\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 the validation errors have changed for a property or for the entire object. \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\">        private\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> event\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> EventHandler\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">DataErrorsChangedEventArgs\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errorsChanged\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 Gets the when errors changed observable event. Occurs when the validation errors have changed for a property or for the entire object. \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 errors changed 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=\"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\">WhenErrorsChanged\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=\"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\">DataErrorsChangedEventArgs\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\">errorsChanged\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\">errorsChanged\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 a value indicating whether the object has validation errors. \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;&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 this instance has errors, 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\">value\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> virtual\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> HasErrors\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\">InitializeErrors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">                return\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Count\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> &gt;\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 0\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 rules which provide the errors.\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;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The rules this instance must satisfy.\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=\"sJvqV\">        protected\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> static\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> RuleCollection\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Rules\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> rules\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 Gets the validation errors for the entire object.\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\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">A collection of errors.\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\">        public\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> IEnumerable\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> GetErrors\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=\"sWm5y\">GetErrors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sMc8R\">null\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 Gets the validation errors for a specified property or for the entire object.\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 to retrieve errors for. \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">null\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> to \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F retrieve all errors for this instance.\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;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">A collection of errors.\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\">        public\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> IEnumerable\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> GetErrors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\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=\"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=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">InitializeErrors\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\">            IEnumerable\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> result\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\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\">))\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sw29p\">                List\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">allErrors\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> List\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;();\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=\"sw29p\">KeyValuePair\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sw29p\">List\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">keyValuePair\u003C\u002Fspan>\u003Cspan class=\"smL5M\"> in\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\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\">                    allErrors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AddRange\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">keyValuePair\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                result\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> allErrors\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\">            else\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=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ContainsKey\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=\"sFrd5\">                    result\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\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=\"smL5M\">                else\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">                {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">                    result\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> List\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;();\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=\"smL5M\">            return\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> result\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 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\">\"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\"> override\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=\"sK46n\">            base\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\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\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\">))\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\">ApplyRules\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\">            else\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\">ApplyRules\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">            base\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnPropertyChanged\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">HasErrorsPropertyName\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 Called when the errors have 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\">\"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\"> OnErrorsChanged\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\">            EventHandler\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">DataErrorsChangedEventArgs\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \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\">errorsChanged\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\"> DataErrorsChangedEventArgs\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 Applies all rules to this instance.\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\">        private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> ApplyRules\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\">InitializeErrors\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\">            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\"> rules\u003C\u002Fspan>\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\">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=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ApplyRules\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 Applies the rules to this instance for the specified property.\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\">        private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> ApplyRules\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\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=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">InitializeErrors\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\">            List\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyErrors\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> rules\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Apply\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">((\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">).\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ToList\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\">propertyErrors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Count\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> &gt;\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 0\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=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ContainsKey\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=\"sK46n\">                    this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">].\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Clear\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\">                else\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=\"sFrd5\">errors\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=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> List\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;();\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=\"sFrd5\">errors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">[\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">].\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">AddRange\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyErrors\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\">OnErrorsChanged\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=\"smL5M\">            else\u003C\u002Fspan>\u003Cspan class=\"smL5M\"> if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">ContainsKey\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=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Remove\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=\"sK46n\">                this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">OnErrorsChanged\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 Initializes the errors and applies the rules if not initialized.\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\">        private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> InitializeErrors\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=\"sK46n\">this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\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=\"sFrd5\">errors\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> Dictionary\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sw29p\">List\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;&gt;();\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\">ApplyRules\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>\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=\"s4J9F\">namespace\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> Framework\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ComponentModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Rules\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>\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 A named rule containing an error to be used if the rule fails.\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\">\"T\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The type of the object the rule applies to.\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=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> abstract\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> Rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;\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\"> string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        private\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> object\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> error\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 Initializes a new instance of the \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"Rule&lt;T&gt;\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> class.\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\">The name of the property this instance applies to.\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\">\"error\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The error message if the rules fails.\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=\"sWm5y\"> Rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> error\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\">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=\"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\">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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">error\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\">error\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=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\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=\"sFrd5\">error\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> error\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 Gets the name of the property this instance applies to.\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;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The name of the property this instance applies to.\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=\"sJvqV\">        public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> PropertyName\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\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=\"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 error message if the rules fails.\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;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The error message if the rules fails.\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=\"sJvqV\">        public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> object\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> Error\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">error\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 Applies the rule to the specified object.\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\">\"obj\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The object to apply the rule to.\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;\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\">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 object satisfies the rule, 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\">.\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\">returns\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=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> Apply\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> obj\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=\"s4J9F\">namespace\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> Framework\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ComponentModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Rules\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>\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 Determines whether or not an object of type \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">typeparamref\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"T\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> satisfies a rule and\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">    \u002F\u002F\u002F provides an error if it does not.\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\">\"T\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The type of the object the rule can be applied to.\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=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> sealed\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> DelegateRule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">Rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;\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\"> Func\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">bool\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">rule\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 Initializes a new instance of the \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"DelegateRule&lt;T&gt;\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> class.\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\">&gt;The name of the property the rules applies to.\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\">\"error\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The error if the rules fails.\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\">\"rule\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The rule to execute.\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\">        public\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> DelegateRule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> error\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sw29p\">Func\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">bool\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sjLUg\">            : \u003C\u002Fspan>\u003Cspan class=\"sK46n\">base\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">error\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\">rule\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\">rule\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=\"sFrd5\">rule\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> rule\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 Applies the rule to the specified object.\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\">\"obj\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The object to apply the rule to.\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;\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\">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 object satisfies the rule, 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\">.\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\">returns\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">        public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> override\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> bool\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> Apply\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> obj\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=\"sWm5y\">rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">obj\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=\"s4J9F\">namespace\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> Framework\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ComponentModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Rules\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\">Collections\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Generic\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\">Collections\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ObjectModel\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 A collection of rules.\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\">\"T\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The type of the object the rules can be applied to.\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=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> sealed\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> RuleCollection\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">Collection\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">Rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;&gt;\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 Adds a new \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"Rule{T}\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\"> to this instance.\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\">The name of the property the rules applies to.\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\">\"error\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The error if the object does not satisfy the rule.\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\">\"rule\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The rule to execute.\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\">        public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> void\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> Add\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> error\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sw29p\">Func\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">bool\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">) \u003C\u002Fspan>\u003Cspan class=\"snCLD\">=&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sK46n\">            this\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Add\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> DelegateRule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">propertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">error\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">rule\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 Applies the \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">see\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> cref\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"Rule{T}\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">'s contained in this instance to \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">paramref\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> name\u003C\u002Fspan>\u003Cspan class=\"s1q82\">=\u003C\u002Fspan>\u003Cspan class=\"swiDo\">\"obj\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">\u002F&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">.\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\">\"obj\"\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">The object to apply the rules to.\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 we want to apply rules for. \u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">null\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">c\u003C\u002Fspan>\u003Cspan class=\"sOBmp\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"s1q82\">        \u002F\u002F\u002F to apply all rules.\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;\u003C\u002Fspan>\u003Cspan class=\"s1q82\">A collection of errors.\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\">        public\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> IEnumerable\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Apply\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> obj\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">, \u003C\u002Fspan>\u003Cspan class=\"sJvqV\">string\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=\"sw29p\">            List\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">errors\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> List\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">object\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;();\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=\"sw29p\">Rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">T\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt; \u003C\u002Fspan>\u003Cspan class=\"sFrd5\">rule\u003C\u002Fspan>\u003Cspan class=\"smL5M\"> in\u003C\u002Fspan>\u003Cspan class=\"sK46n\"> this\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=\"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\">||\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">PropertyName\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Equals\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=\"smL5M\">                    if\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> (\u003C\u002Fspan>\u003Cspan class=\"snCLD\">!\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Apply\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">obj\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\">                        errors\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Add\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">rule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Error\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>\u003Cspan class=\"line\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"smL5M\">            return\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> errors\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>",[145,231,233,240],{"id":232},"simple-example",[53,234,236],{"href":235,"aria-hidden":151},"#simple-example",[153,237,238],{"xmlns":155,"xmlns:xlink":156,"viewBox":157,"version":158,"width":159,"height":159,"aria-hidden":151},[161,239],{"fill":163,"fill-rule":164,"d":165},"Simple Example",[76,242,243],{},"An example of how you can use this base class is as follows.",[183,245],{"className":185,"language":186,"meta":187,"style":187,"html":246},"\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">public\u003C\u002Fspan>\u003Cspan class=\"s4J9F\"> class\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> ZombieViewModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\"> : \u003C\u002Fspan>\u003Cspan class=\"sw29p\">NotifyDataErrorInfo\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ZombieViewModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;\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\"> string\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> name\u003C\u002Fspan>\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\"> limbsRemaining\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\">    static\u003C\u002Fspan>\u003Cspan class=\"sWm5y\"> ZombieViewModel\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\">        Rules\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Add\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> DelegateRule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ZombieViewModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"swiDo\">            \"Name\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"swiDo\">            \"Name cannot be empty.\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">            x\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> =&gt;\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> !\u003C\u002Fspan>\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\">x\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sFrd5\">Name\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">)));\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        Rules\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Add\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> DelegateRule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ZombieViewModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"swiDo\">            \"LimbsRemaining\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"swiDo\">            \"A zombie can't have less than zero limbs.\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\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\">LimbsRemaining\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> &gt;=\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 0\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">));\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sFrd5\">        Rules\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">.\u003C\u002Fspan>\u003Cspan class=\"sWm5y\">Add\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">(\u003C\u002Fspan>\u003Cspan class=\"sJvqV\">new\u003C\u002Fspan>\u003Cspan class=\"sw29p\"> DelegateRule\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sw29p\">ZombieViewModel\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">&gt;(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"swiDo\">            \"LimbsRemaining\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"swiDo\">            \"A zombie can only have up to four limbs.\"\u003C\u002Fspan>\u003Cspan class=\"sjLUg\">,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\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\">LimbsRemaining\u003C\u002Fspan>\u003Cspan class=\"snCLD\"> &lt;=\u003C\u002Fspan>\u003Cspan class=\"s0PsH\"> 4\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\"> Name\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\">name\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\">name\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>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"sJvqV\">    public\u003C\u002Fspan>\u003Cspan class=\"sJvqV\"> int\u003C\u002Fspan>\u003Cspan class=\"sFrd5\"> LimbsRemaining\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\">limbsRemaining\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\">limbsRemaining\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>",[76,248,249,250,253,254,257],{},"As you can see, our view model has two properties and as shown in the last post in the series we are using the ",[112,251,252],{},"SetProperty"," method to raise ",[112,255,256],{},"PropertyChanged"," events. The only bit I've added for validation is in the static constructor containing the three validation rules.",[76,259,260,261,264,265,268],{},"The ",[112,262,263],{},"Name"," property has a single rule applied to it. When the name is empty a validation error is raised. The ",[112,266,267],{},"LimbsRemaining"," property has two rules and when it is less than zero or more than four, validation errors are raised auto-magically.",[76,270,271,272,274,275,277,278,280,281,283,284,286],{},"Under the covers, each time the ",[112,273,256],{}," event is raised, we apply the corresponding rule relating to the property and if the rule fails, we raise the ",[112,276,172],{}," event, raise a ",[112,279,256],{}," event for the ",[112,282,176],{}," property (Which is now true) and finally ensure that any calls to ",[112,285,180],{}," now returns the error shown in the rule.",[145,288,290,297],{"id":289},"extensibility",[53,291,293],{"href":292,"aria-hidden":151},"#extensibility",[153,294,295],{"xmlns":155,"xmlns:xlink":156,"viewBox":157,"version":158,"width":159,"height":159,"aria-hidden":151},[161,296],{"fill":163,"fill-rule":164,"d":165},"Extensibility",[76,299,260,300,303,304,307],{},[112,301,302],{},"DelegateRule\u003CT>"," class shown above is a really easy way to provide nice, simple rules. If you need something more complex you can create your own rule by inheriting from the ",[112,305,306],{},"Rule\u003CT>"," base class. An example of this could be a custom rule to validate an email address or telephone number.",[145,309,311,318],{"id":310},"using-reactive-extensions-rx-to-replace-the-errorschanged-event",[53,312,314],{"href":313,"aria-hidden":151},"#using-reactive-extensions-rx-to-replace-the-errorschanged-event",[153,315,316],{"xmlns":155,"xmlns:xlink":156,"viewBox":157,"version":158,"width":159,"height":159,"aria-hidden":151},[161,317],{"fill":163,"fill-rule":164,"d":165},"Using Reactive Extensions (Rx) to Replace the ErrorsChanged Event",[76,320,321,322,118],{},"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,323,325],{"href":324},"\u002Freactive-extensions-part1-replacing-events\u002F","past",[76,327,328,329,331,332,337],{},"We can hide the ",[112,330,172],{}," C# event by explicitly implementing the interface (Click ",[53,333,336],{"href":334,"rel":335,"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,339,260,340,342,343,345,346,349,350,353],{},[112,341,172],{}," C# event can still be accessed by first casting the object to ",[112,344,87],{},". Validation in XAML languages, which uses this interface continues to work. Our new Reactive Extensions (Rx) observable event called ",[112,347,348],{},"WhenErrorsChanged"," of type? ",[112,351,352],{},"IObservable\u003Cstring>"," (The string is the property name) is now the default method of subscribing for error changed events and we've hidden away the old C# event.",[145,355,357,364],{"id":356},"inotifydataerrorinfo-support",[53,358,360],{"href":359,"aria-hidden":151},"#inotifydataerrorinfo-support",[153,361,362],{"xmlns":155,"xmlns:xlink":156,"viewBox":157,"version":158,"width":159,"height":159,"aria-hidden":151},[161,363],{"fill":163,"fill-rule":164,"d":165},"INotifyDataErrorInfo Support",[76,366,260,367,369,370,375],{},[112,368,87],{}," interface is supported by most XAML frameworks including WPF, Silverlight and Windows Phone. Currently WinRT does not support the interface at the time of writing but you can bet that they will in future and in the mean time you can use the ",[53,371,374],{"href":372,"rel":373,"target":86},"https:\u002F\u002Fwinrtxamlvalidation.codeplex.com\u002F",[83,84,85],"WinRT XAML Validation library"," in conjunction with the code below to plug this gap.",[145,377,379,386],{"id":378},"quick-nod-to-idataerrorinfo",[53,380,382],{"href":381,"aria-hidden":151},"#quick-nod-to-idataerrorinfo",[153,383,384],{"xmlns":155,"xmlns:xlink":156,"viewBox":157,"version":158,"width":159,"height":159,"aria-hidden":151},[161,385],{"fill":163,"fill-rule":164,"d":165},"Quick nod to IDataErrorInfo",[76,388,389,390,392],{},"This interface used to be used for validation but was replaced by ",[112,391,87],{},". The new interface provides a much nicer API which is easier to code against and better performance. If you are still using the old interface, its time to make the change.",[145,394,396,403],{"id":395},"conclusions",[53,397,399],{"href":398,"aria-hidden":151},"#conclusions",[153,400,401],{"xmlns":155,"xmlns:xlink":156,"viewBox":157,"version":158,"width":159,"height":159,"aria-hidden":151},[161,402],{"fill":163,"fill-rule":164,"d":165},"Conclusions",[76,405,406,407,409],{},"I have been tweaking this base class for the last few years and feel I've got a fairly good balance. I've not seen too many implementations of this interface, most blogs seem to cover ",[112,408,203],{}," pretty well though. I'd be very interested if anyone has any comments or thoughts on improvements. Feel free to sound-off in the comments.",[411,412,413],"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 .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 .sWm5y, html code.shiki .sWm5y{--shiki-default:#795E26;--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 .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 .snDo4, html code.shiki .snDo4{--shiki-default:#E50000;--shiki-dark:#A6E22E}html pre.shiki code .swiDo, html code.shiki .swiDo{--shiki-default:#A31515;--shiki-dark:#E6DB74}html pre.shiki code .snCLD, html code.shiki .snCLD{--shiki-default:#000000;--shiki-dark:#F92672}html pre.shiki code .sK46n, html code.shiki .sK46n{--shiki-default:#0000FF;--shiki-dark:#FD971F}html pre.shiki code .s0PsH, html code.shiki .s0PsH{--shiki-default:#098658;--shiki-dark:#AE81FF}html pre.shiki code .sMc8R, html code.shiki .sMc8R{--shiki-default:#0000FF;--shiki-dark:#AE81FF}",{"title":187,"searchDepth":415,"depth":415,"links":416},2,[],{"issue":418,"comments":422},{"number":419,"title":420,"html_url":421},93,"[Comment] Model-View-ViewModel (MVVM) - Part 4 - INotifyDataErrorInfo","https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93",[423,435,443,451,459,467,475,484,493,501,509,517,525,533,541,549,557,565,573,581,589,597,605,613,621,629,637,645,653,661,669,677,685,693,701,709,717,725,733,741,749,757,765,773,781,789,798,807,816,825,833,841],{"id":424,"html_url":425,"body_html":426,"created_at":427,"updated_at":427,"author_association":428,"user":429,"reactions":433},627265098,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265098","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F7b66ac02271c078e0d1c3e10006eb4c0a4531b9c041c3113e26deacd28b53d8e\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32386639343033343465643633386466323966336435376633333937333738333f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Nicolas\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F7b66ac02271c078e0d1c3e10006eb4c0a4531b9c041c3113e26deacd28b53d8e\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32386639343033343465643633386466323966336435376633333937333738333f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Nicolas\u003C\u002Fstrong> commented on \u003Cstrong>2014-11-08 22:44:40\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hi,\u003C\u002Fp>\n\u003Cp>What is \u003Ccode>RuleCollection\u003C\u002Fcode> in this \u003Ccode>private static RuleCollection rules = new RuleCollection();\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>\u002F\u002F\u002F \u003C\u002Fspan>\n\u003Cspan>\u002F\u002F\u002F Gets the rules which provide the errors.\u003C\u002Fspan>\n\u003Cspan>\u002F\u002F\u002F \u003C\u002Fspan>\n\u003Cspan>\u002F\u002F\u002F The rules this instance must satisfy.\u003C\u002Fspan>\n\u003Cspan>protected\u003C\u002Fspan> \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>RuleCollection\u003C\u002Fspan> \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>rules\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>I cannot figure this out if it is a list or anything else. Can you define it some where.\u003Cbr \u002F>\nEverything else is awesome.\u003C\u002Fp>","2020-05-12T10:48:01Z","OWNER",{"login":430,"avatar_url":431,"html_url":432},"RehanSaeed","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2270364?v=4","https:\u002F\u002Fgithub.com\u002FRehanSaeed",{"url":434,"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\u002F627265098\u002Freactions",{"id":436,"html_url":437,"body_html":438,"created_at":439,"updated_at":439,"author_association":428,"user":440,"reactions":441},627265150,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265150","\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>2014-11-09 12:04:44\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hi,\u003C\u002Fp>\n\u003Cp>What is \u003Ccode>RuleCollection\u003C\u002Fcode> in this \u003Ccode>private static RuleCollection rules = new RuleCollection();\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>\u002F\u002F\u002F \u003C\u002Fspan>\n\u003Cspan>\u002F\u002F\u002F Gets the rules which provide the errors.\u003C\u002Fspan>\n\u003Cspan>\u002F\u002F\u002F \u003C\u002Fspan>\n\u003Cspan>\u002F\u002F\u002F The rules this instance must satisfy.\u003C\u002Fspan>\n\u003Cspan>protected\u003C\u002Fspan> \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>RuleCollection\u003C\u002Fspan> \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>rules\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>I cannot figure this out if it is a list or anything else. Can you define it some where.\u003Cbr \u002F>\nEverything else is awesome.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>It holds the validation rules for your view model.\u003C\u002Fp>\n\u003Cp>For a real example look at the Validation tab in the Elysium Extra sample application. You can find the project on CodePlex, there are posts on my blog or install the Elysium.Extra NuGet package which also contains the sample application and source code.\u003C\u002Fp>\n\u003Cp>That example shows how the above code can be used to validate input from various controls including TextBox, ComboBox and DatePicker with cool effects too.\u003C\u002Fp>","2020-05-12T10:48:08Z",{"login":430,"avatar_url":431,"html_url":432},{"url":442,"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\u002F627265150\u002Freactions",{"id":444,"html_url":445,"body_html":446,"created_at":447,"updated_at":447,"author_association":428,"user":448,"reactions":449},627265192,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265192","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F7b66ac02271c078e0d1c3e10006eb4c0a4531b9c041c3113e26deacd28b53d8e\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32386639343033343465643633386466323966336435376633333937333738333f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Nicolas\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F7b66ac02271c078e0d1c3e10006eb4c0a4531b9c041c3113e26deacd28b53d8e\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32386639343033343465643633386466323966336435376633333937333738333f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Nicolas\u003C\u002Fstrong> commented on \u003Cstrong>2014-11-10 14:42:36\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>It holds the validation rules for your view model.\u003C\u002Fp>\n\u003Cp>For a real example look at the Validation tab in the Elysium Extra sample application. You can find the project on CodePlex, there are posts on my blog or install the Elysium.Extra NuGet package which also contains the sample application and source code.\u003C\u002Fp>\n\u003Cp>That example shows how the above code can be used to validate input from various controls including TextBox, ComboBox and DatePicker with cool effects too.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Thanks\u003C\u002Fp>","2020-05-12T10:48:15Z",{"login":430,"avatar_url":431,"html_url":432},{"url":450,"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\u002F627265192\u002Freactions",{"id":452,"html_url":453,"body_html":454,"created_at":455,"updated_at":455,"author_association":428,"user":456,"reactions":457},627265243,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265243","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F4c4cec74a25ff211fd5ee9a54845f92cf5c50fa7108b4a903b1648515933f1ee\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38306638306636343735336137333730383464333861663538633665313131653f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Suhas\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F4c4cec74a25ff211fd5ee9a54845f92cf5c50fa7108b4a903b1648515933f1ee\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38306638306636343735336137333730383464333861663538633665313131653f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Suhas\u003C\u002Fstrong> commented on \u003Cstrong>2015-06-12 16:07:17\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hey I have been reading your implementations for these classes and have been using them for development. I notice that you have implemented your \u003Ccode>INotifyErrorInfo\u003C\u002Fcode> &amp; \u003Ccode>INotifyPropertyChanged\u003C\u002Fcode> as two classes rather than interfaces. This would mean that I cannot define a \u003Ccode>BaseViewModel\u003C\u002Fcode> class that can handle Error Notifications and Property changed notifications concurrently. Am I incorrect in my assessment? How do you deal with something like this? (example Login page where you need to implement \u003Ccode>INotifyPropertyChanged\u003C\u002Fcode> to show a Splash Screen when the password is entered &amp; a key command is pressed but also throw exceptions for your credentials.)\u003Cbr \u002F>\nBy the way,Great implementation for Elysium Extra. Makes UI much easier!.\u003Cbr \u002F>\nThanks,\u003Cbr \u002F>\nSuhas\u003C\u002Fp>","2020-05-12T10:48:22Z",{"login":430,"avatar_url":431,"html_url":432},{"url":458,"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\u002F627265243\u002Freactions",{"id":460,"html_url":461,"body_html":462,"created_at":463,"updated_at":463,"author_association":428,"user":464,"reactions":465},627265290,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265290","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F4c4cec74a25ff211fd5ee9a54845f92cf5c50fa7108b4a903b1648515933f1ee\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38306638306636343735336137333730383464333861663538633665313131653f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Suhas\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F4c4cec74a25ff211fd5ee9a54845f92cf5c50fa7108b4a903b1648515933f1ee\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38306638306636343735336137333730383464333861663538633665313131653f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Suhas\u003C\u002Fstrong> commented on \u003Cstrong>2015-06-12 16:25:50\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Sorry. Reread your post. You already thought of that and inherited from the class you defined earlier. My bad! This makes it much easier. Thanks a TON!\u003C\u002Fp>","2020-05-12T10:48:29Z",{"login":430,"avatar_url":431,"html_url":432},{"url":466,"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\u002F627265290\u002Freactions",{"id":468,"html_url":469,"body_html":470,"created_at":471,"updated_at":471,"author_association":428,"user":472,"reactions":473},627265341,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265341","\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-06-12 17:15:08\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Sorry. Reread your post. You already thought of that and inherited from the class you defined earlier. My bad! This makes it much easier. Thanks a TON!\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Good stuff. You saved me from writing a really long reply.\u003C\u002Fp>","2020-05-12T10:48:37Z",{"login":430,"avatar_url":431,"html_url":432},{"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\u002F627265341\u002Freactions",{"id":476,"html_url":477,"body_html":478,"created_at":479,"updated_at":480,"author_association":428,"user":481,"reactions":482},627265402,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265402","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F29e54a05829ec73c5e8a22139b1ec510ace81945112a2b6c530b8cc743fa57bf\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39373763663264386333666333353335646430616563326364653631363032643f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Rata\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F29e54a05829ec73c5e8a22139b1ec510ace81945112a2b6c530b8cc743fa57bf\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39373763663264386333666333353335646430616563326364653631363032643f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Rata\u003C\u002Fstrong> commented on \u003Cstrong>2015-10-20 19:05:03\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hi. Very nice blog, it helped me a lot!\u003C\u002Fp>\n\u003Cp>I got a questions:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Don't you think, that passing \u003Ccode>propertyName\u003C\u002Fcode> as string when you add \u003Ccode>Rules\u003C\u002Fcode> can lead to typo-like mistakes? Maybe it should be done with reflection as far as we initialize \u003Ccode>Rules\u003C\u002Fcode> only 1 time on viewmodel creation, so it will not so performance-affective but more safe for human mistakes?\u003C\u002Fli>\n\u003Cli>If I need to implement some display-related logic in viewmodel, that should run when my property changed, should i execute my method from property setter or my viewmodel should subscribe on \u003Ccode>PropertyChanged\u003C\u002Fcode> event in \u003Ccode>viewmodelBase\u003C\u002Fcode>?\u003Cbr \u002F>\nAnd if i should use second way, should i make switch based on string property name in method that process \u003Ccode>PropertyChanged\u003C\u002Fcode> event, or there is some alternative?\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>I ask this questions because im really afraid of human factor when i use string names instead of types and so on.\u003C\u002Fp>\n\u003Cp>Sorry for my bad english.\u003C\u002Fp>","2020-05-12T10:48:44Z","2020-05-12T11:47:32Z",{"login":430,"avatar_url":431,"html_url":432},{"url":483,"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\u002F627265402\u002Freactions",{"id":485,"html_url":486,"body_html":487,"created_at":488,"updated_at":489,"author_association":428,"user":490,"reactions":491},627265453,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265453","\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:13:30\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hi. Very nice blog, it helped me a lot!\u003C\u002Fp>\n\u003Cp>I got a questions:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Don't you think, that passing \u003Ccode>propertyName\u003C\u002Fcode> as string when you add \u003Ccode>Rules\u003C\u002Fcode> can lead to typo-like mistakes? Maybe it should be done with reflection as far as we initialize \u003Ccode>Rules\u003C\u002Fcode> only 1 time on viewmodel creation, so it will not so performance-affective but more safe for human mistakes?\u003C\u002Fli>\n\u003Cli>If I need to implement some display-related logic in viewmodel, that should run when my property changed, should i execute my method from property setter or my viewmodel should subscribe on \u003Ccode>PropertyChanged\u003C\u002Fcode> event in \u003Ccode>viewmodelBase\u003C\u002Fcode>?\u003Cbr \u002F>\nAnd if i should use second way, should i make switch based on string property name in method that process \u003Ccode>PropertyChanged\u003C\u002Fcode> event, or there is some alternative?\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>I ask this questions because im really afraid of human factor when i use string names instead of types and so on.\u003C\u002Fp>\n\u003Cp>Sorry for my bad english.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Hi,\u003C\u002Fp>\n\u003Col>\n\u003Cli>Yes it can. That's why you can use the \u003Ccode>[CallerMemberName]\u003C\u002Fcode> attribute or the new C# 6 \u003Ccode>nameof\u003C\u002Fcode> operator. Reflection is slow but maybe it works for you if you can't use C# 6.\u003C\u002Fli>\n\u003Cli>I tend to call the method in the property setter as the property changed event handler can be called if any other property changes too.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Hope that helps.\u003C\u002Fp>","2020-05-12T10:48:51Z","2020-05-12T11:48:14Z",{"login":430,"avatar_url":431,"html_url":432},{"url":492,"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\u002F627265453\u002Freactions",{"id":494,"html_url":495,"body_html":496,"created_at":497,"updated_at":497,"author_association":428,"user":498,"reactions":499},627265498,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265498","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F335c704c37ff1a95f67db1c66b3890e0bc2913a102a8507a1645a6daba5c7c11\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f36633939616465303831616466336464356464653133643630383737333738383f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Ali\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F335c704c37ff1a95f67db1c66b3890e0bc2913a102a8507a1645a6daba5c7c11\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f36633939616465303831616466336464356464653133643630383737333738383f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Ali\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-03 20:29:13\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hi Rehan\u003C\u002Fp>\n\u003Cp>Thanks for your article; i have learned a lot from it; i am new to WPF and wondering if following can be done. I have created following classes and want to add addition rules in owner class for re-usability of FMName class:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>public\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>FMName\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>NotifyDataErrorInfo\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>_FirstName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>_MiddleName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>_LastName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n    \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>FMName\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>Base\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n            \u003Cspan>\"FirstName\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>\"Name cannot be Empty\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>!\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>FirstName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>Base\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n            \u003Cspan>\"LastName\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>\"Name cannot be Empty\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>!\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>FirstName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>Base\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n            \u003Cspan>\"MiddleName\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>\"Name cannot be Empty\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>!\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>FirstName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>LastName\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_LastName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_LastName\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>MiddleName\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>_MiddleName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_MiddleName\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>FirstName\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>_FirstName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_FirstName\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\n\n\u003Cspan>public\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>Owner\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>NotifyDataErrorInfo\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>int\u003C\u002Fspan> \u003Cspan>_OwnerID\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>FMName\u003C\u002Fspan> \u003Cspan>_OwnerName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>new\u003C\u002Fspan> \u003Cspan>FMName\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n \n    \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>Owner\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>Base\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n           \u003Cspan>\"Owner.FirstName\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n           \u003Cspan>\"Owner First Name Cannot have less than 4 Characters\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n           x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>OwnerName\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>FirstName\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Length\u003C\u002Fspan> \u003Cspan>&lt;\u003C\u002Fspan> \u003Cspan>4\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n \n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>int\u003C\u002Fspan> \u003Cspan>OwnerID\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_OwnerID\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_OwnerID\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n \n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>FMName\u003C\u002Fspan> \u003Cspan>OwnerName\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>_OwnerName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_OwnerName\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>I am getting property doesn't exist in following:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>Owner\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>Base\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n        \u003Cspan>\"Owner.FirstName\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>\"Owner First Name Cannot have less than 4 Characters\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>OwnerName\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>FirstName\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Lengt\u003C\u002Fspan> \u003Cspan>&lt;\u003C\u002Fspan> \u003Cspan>4\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Thanks again!\u003C\u002Fp>\n\u003Cp>Ali\u003C\u002Fp>","2020-05-12T10:48:58Z",{"login":430,"avatar_url":431,"html_url":432},{"url":500,"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\u002F627265498\u002Freactions",{"id":502,"html_url":503,"body_html":504,"created_at":505,"updated_at":505,"author_association":428,"user":506,"reactions":507},627265537,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265537","\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-03-03 21:25:01\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hi Rehan\u003C\u002Fp>\n\u003Cp>Thanks for your article; i have learned a lot from it; i am new to WPF and wondering if following can be done. I have created following classes and want to add addition rules in owner class for re-usability of FMName class:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>public\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>FMName\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>NotifyDataErrorInfo\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>_FirstName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>_MiddleName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>_LastName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n    \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>FMName\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>Base\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n            \u003Cspan>\"FirstName\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>\"Name cannot be Empty\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>!\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>FirstName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>Base\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n            \u003Cspan>\"LastName\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>\"Name cannot be Empty\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>!\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>FirstName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>Base\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n            \u003Cspan>\"MiddleName\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>\"Name cannot be Empty\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>!\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>FirstName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>LastName\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_LastName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_LastName\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>MiddleName\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>_MiddleName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_MiddleName\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan> \u003Cspan>FirstName\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>_FirstName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_FirstName\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\n\n\u003Cspan>public\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>Owner\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>NotifyDataErrorInfo\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>int\u003C\u002Fspan> \u003Cspan>_OwnerID\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>FMName\u003C\u002Fspan> \u003Cspan>_OwnerName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>new\u003C\u002Fspan> \u003Cspan>FMName\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n \n    \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>Owner\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>Base\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n           \u003Cspan>\"Owner.FirstName\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n           \u003Cspan>\"Owner First Name Cannot have less than 4 Characters\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n           x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>OwnerName\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>FirstName\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Length\u003C\u002Fspan> \u003Cspan>&lt;\u003C\u002Fspan> \u003Cspan>4\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n \n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>int\u003C\u002Fspan> \u003Cspan>OwnerID\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_OwnerID\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_OwnerID\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n \n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>FMName\u003C\u002Fspan> \u003Cspan>OwnerName\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>_OwnerName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_OwnerName\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>I am getting property doesn't exist in following:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>Owner\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>Base\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n        \u003Cspan>\"Owner.FirstName\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>\"Owner First Name Cannot have less than 4 Characters\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>OwnerName\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>FirstName\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Lengt\u003C\u002Fspan> \u003Cspan>&lt;\u003C\u002Fspan> \u003Cspan>4\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Thanks again!\u003C\u002Fp>\n\u003Cp>Ali\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Hmmmm, I'm not sure that would work. You are creating a validation rule for FMName.FirstName but in the Owner class, I would say this is bad from a design perspective. That rule should live in FMName. If you need to turn the rule on or off under certain conditions then this can be part of the rule itself.\u003C\u002Fp>","2020-05-12T10:49:04Z",{"login":430,"avatar_url":431,"html_url":432},{"url":508,"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\u002F627265537\u002Freactions",{"id":510,"html_url":511,"body_html":512,"created_at":513,"updated_at":513,"author_association":428,"user":514,"reactions":515},627265600,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265600","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F335c704c37ff1a95f67db1c66b3890e0bc2913a102a8507a1645a6daba5c7c11\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f36633939616465303831616466336464356464653133643630383737333738383f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Ali\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F335c704c37ff1a95f67db1c66b3890e0bc2913a102a8507a1645a6daba5c7c11\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f36633939616465303831616466336464356464653133643630383737333738383f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Ali\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-03 21:45:20\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hmmmm, I'm not sure that would work. You are creating a validation rule for FMName.FirstName but in the Owner class, I would say this is bad from a design perspective. That rule should live in FMName. If you need to turn the rule on or off under certain conditions then this can be part of the rule itself.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Is there any way I turn the rule on\u002Foff from owner class?\u003C\u002Fp>","2020-05-12T10:49:11Z",{"login":430,"avatar_url":431,"html_url":432},{"url":516,"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\u002F627265600\u002Freactions",{"id":518,"html_url":519,"body_html":520,"created_at":521,"updated_at":521,"author_association":428,"user":522,"reactions":523},627265662,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265662","\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-03-03 22:01:11\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Is there any way I turn the rule on\u002Foff from owner class?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Your owner class could set a boolean property on the child class to turn the property on or off. When the boolean property changes, you can raise a \u003Ccode>PropertyChanged\u003C\u002Fcode> notification for FirstName which will cause the rule to be re-evaluated.\u003C\u002Fp>","2020-05-12T10:49:18Z",{"login":430,"avatar_url":431,"html_url":432},{"url":524,"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\u002F627265662\u002Freactions",{"id":526,"html_url":527,"body_html":528,"created_at":529,"updated_at":529,"author_association":428,"user":530,"reactions":531},627265714,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265714","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F335c704c37ff1a95f67db1c66b3890e0bc2913a102a8507a1645a6daba5c7c11\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f36633939616465303831616466336464356464653133643630383737333738383f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Ali\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F335c704c37ff1a95f67db1c66b3890e0bc2913a102a8507a1645a6daba5c7c11\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f36633939616465303831616466336464356464653133643630383737333738383f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Ali\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-03 22:06:53\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Your owner class could set a boolean property on the child class to turn the property on or off. When the boolean property changes, you can raise a \u003Ccode>PropertyChanged\u003C\u002Fcode> notification for FirstName which will cause the rule to be re-evaluated.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I will try that, thanks a lot.\u003C\u002Fp>","2020-05-12T10:49:25Z",{"login":430,"avatar_url":431,"html_url":432},{"url":532,"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\u002F627265714\u002Freactions",{"id":534,"html_url":535,"body_html":536,"created_at":537,"updated_at":537,"author_association":428,"user":538,"reactions":539},627265768,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265768","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fb22bf23135618dda1265e96eea984dd270936c03a5c2d399bb5fd04182b7f6f4\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f33343661373235663537643063616666653162613236353531333564326238383f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Alex C\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fb22bf23135618dda1265e96eea984dd270936c03a5c2d399bb5fd04182b7f6f4\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f33343661373235663537643063616666653162613236353531333564326238383f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Alex C\u003C\u002Fstrong> commented on \u003Cstrong>2016-04-06 19:19:16\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hi. This is a great article. As a noob, I'm wondering how the errors would be displayed in the XAML. Do you have a sample of that?\u003C\u002Fp>","2020-05-12T10:49:32Z",{"login":430,"avatar_url":431,"html_url":432},{"url":540,"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\u002F627265768\u002Freactions",{"id":542,"html_url":543,"body_html":544,"created_at":545,"updated_at":545,"author_association":428,"user":546,"reactions":547},627265831,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265831","\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-04-07 09:05:15\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hi. This is a great article. As a noob, I'm wondering how the errors would be displayed in the XAML. Do you have a sample of that?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>There is a working example in \u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002FElysium-Extra\">Elysium Extra\u003C\u002Fa> or see \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fwww.codeproject.com\u002FTips\u002F876349\u002FWPF-Validation-using-INotifyDataErrorInfo\">this\u003C\u002Fa>.\u003C\u002Fp>","2020-05-12T10:49:39Z",{"login":430,"avatar_url":431,"html_url":432},{"url":548,"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\u002F627265831\u002Freactions",{"id":550,"html_url":551,"body_html":552,"created_at":553,"updated_at":553,"author_association":428,"user":554,"reactions":555},627265879,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265879","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8d3f957ffdd897c1a8b9af90e47b803f58d039d310f594f104b4719d06616ba6\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f66313332353134376161346538616336636564623066363737643531326634613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Nuri\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8d3f957ffdd897c1a8b9af90e47b803f58d039d310f594f104b4719d06616ba6\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f66313332353134376161346538616336636564623066363737643531326634613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Nuri\u003C\u002Fstrong> commented on \u003Cstrong>2016-05-09 09:17:43\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hi Muhammad,\u003C\u002Fp>\n\u003Cp>Nice page. Thanks.\u003Cbr \u002F>\nI'm wondering that how can I handle (forexample display dialog to user) when Command throw exception? Command called by View, it mutes when catch exception.\u003C\u002Fp>","2020-05-12T10:49:45Z",{"login":430,"avatar_url":431,"html_url":432},{"url":556,"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\u002F627265879\u002Freactions",{"id":558,"html_url":559,"body_html":560,"created_at":561,"updated_at":561,"author_association":428,"user":562,"reactions":563},627265940,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265940","\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-09 14:51:15\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hi Muhammad,\u003C\u002Fp>\n\u003Cp>Nice page. Thanks.\u003Cbr \u002F>\nI'm wondering that how can I handle (forexample display dialog to user) when Command throw exception? Command called by View, it mutes when catch exception.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>First don't use exceptions to write application logic. If something is invalid, try to use an 'if statement' instead. If you still need to catch an exception, then go for it. Not sure what you mean by 'mutes'.\u003C\u002Fp>","2020-05-12T10:49:52Z",{"login":430,"avatar_url":431,"html_url":432},{"url":564,"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\u002F627265940\u002Freactions",{"id":566,"html_url":567,"body_html":568,"created_at":569,"updated_at":569,"author_association":428,"user":570,"reactions":571},627265989,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627265989","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Ffdaeb21308fb78609802cf430e47694e97be59e41eeefea52958866fb5c3f12a\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32633637343163336437353038646633333033343439393938323535643364633f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Jason\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Ffdaeb21308fb78609802cf430e47694e97be59e41eeefea52958866fb5c3f12a\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32633637343163336437353038646633333033343439393938323535643364633f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Jason\u003C\u002Fstrong> commented on \u003Cstrong>2016-06-21 22:41:49\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Probably one the best MVVM series I've read.\u003Cbr \u002F>\nHow do you deal with binding errors from the view? Consider the situation where the user enters letters into textbox that is bound to an integer property in your view model. The view model is remains in a valid state because the change never got that far.\u003C\u002Fp>","2020-05-12T10:49:59Z",{"login":430,"avatar_url":431,"html_url":432},{"url":572,"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\u002F627265989\u002Freactions",{"id":574,"html_url":575,"body_html":576,"created_at":577,"updated_at":577,"author_association":428,"user":578,"reactions":579},627266033,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266033","\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-06-22 15:29:21\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Probably one the best MVVM series I've read.\u003Cbr \u002F>\nHow do you deal with binding errors from the view? Consider the situation where the user enters letters into textbox that is bound to an integer property in your view model. The view model is remains in a valid state because the change never got that far.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>The way to deal with binding errors is to not have them. You get notified of them in the output window in Visual Studio, so it's pretty easy to find and fix them.\u003C\u002Fp>\n\u003Cp>If you are asking about how to do the XAML side of validation, then take a look at the Elysium Extra on Codeplex which has a very good example.\u003C\u002Fp>","2020-05-12T10:50:05Z",{"login":430,"avatar_url":431,"html_url":432},{"url":580,"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\u002F627266033\u002Freactions",{"id":582,"html_url":583,"body_html":584,"created_at":585,"updated_at":585,"author_association":428,"user":586,"reactions":587},627266075,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266075","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Ffdaeb21308fb78609802cf430e47694e97be59e41eeefea52958866fb5c3f12a\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32633637343163336437353038646633333033343439393938323535643364633f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Jason\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Ffdaeb21308fb78609802cf430e47694e97be59e41eeefea52958866fb5c3f12a\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32633637343163336437353038646633333033343439393938323535643364633f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Jason\u003C\u002Fstrong> commented on \u003Cstrong>2016-06-23 20:13:41\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Thanks for the reply. Silverlight has a \u003Ccode>BindingValidationError\u003C\u002Fcode> routedevent on the \u003Ccode>FrameworkElement\u003C\u002Fcode> that needs to be handled in a robust application. If you don't, the view could be in an invalid state while the view model remains valid. I suspect WPF and others have similar issues, but using different events. I think the Prism library examples expose all view model properties as nullable even though they are required to get around some of it. Since the binding mechanism defaults to null on binding error, this method will work for required fields. It will fail if the user puts garbage into a field that isn't required. The user will think they saved garbage while the view model saved an empty field. I just thought you might be familiar with the problem and already had a slick implementation. Cheers.\u003C\u002Fp>","2020-05-12T10:50:12Z",{"login":430,"avatar_url":431,"html_url":432},{"url":588,"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\u002F627266075\u002Freactions",{"id":590,"html_url":591,"body_html":592,"created_at":593,"updated_at":593,"author_association":428,"user":594,"reactions":595},627266118,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266118","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F617aef2d46c27a6b66c62a1ed863d6539b586ebf991c0b139f37809e11b1ba42\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f64653862323863323938373137613438666533653261663362386261326530393f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Anders\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F617aef2d46c27a6b66c62a1ed863d6539b586ebf991c0b139f37809e11b1ba42\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f64653862323863323938373137613438666533653261663362386261326530393f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Anders\u003C\u002Fstrong> commented on \u003Cstrong>2016-10-14 09:40:22\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>That's 300 lines of code to validate if a textbox is empty!!! GEESUS !!!\u003C\u002Fp>","2020-05-12T10:50:19Z",{"login":430,"avatar_url":431,"html_url":432},{"url":596,"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\u002F627266118\u002Freactions",{"id":598,"html_url":599,"body_html":600,"created_at":601,"updated_at":601,"author_association":428,"user":602,"reactions":603},627266168,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266168","\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-10-14 10:04:54\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>That's 300 lines of code to validate if a textbox is empty!!! GEESUS !!!\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>That's 300 lines you don't need to write! Look how clean and simple the \u003Ccode>ZombieViewModel\u003C\u002Fcode> looks because of those 300 lines!\u003C\u002Fp>","2020-05-12T10:50:25Z",{"login":430,"avatar_url":431,"html_url":432},{"url":604,"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\u002F627266168\u002Freactions",{"id":606,"html_url":607,"body_html":608,"created_at":609,"updated_at":609,"author_association":428,"user":610,"reactions":611},627266282,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266282","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc1dcc86fe6c0e4b7651bc93b6c2f3123ee1b414f94ba91cf1ceb1880623db113\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34646433396538336631653139353033343233323165356432656362633861313f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Mark\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc1dcc86fe6c0e4b7651bc93b6c2f3123ee1b414f94ba91cf1ceb1880623db113\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34646433396538336631653139353033343233323165356432656362633861313f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Mark\u003C\u002Fstrong> commented on \u003Cstrong>2016-12-21 04:22:57\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Awesome work btw!\u003C\u002Fp>","2020-05-12T10:50:39Z",{"login":430,"avatar_url":431,"html_url":432},{"url":612,"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\u002F627266282\u002Freactions",{"id":614,"html_url":615,"body_html":616,"created_at":617,"updated_at":617,"author_association":428,"user":618,"reactions":619},627266327,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266327","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F688b15a1a67ec012aeb850b4e426bada5cb276c30602118017e4c76d2326825f\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38623837666230383066623865646331326463646136346438386438613036343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Artur\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F688b15a1a67ec012aeb850b4e426bada5cb276c30602118017e4c76d2326825f\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38623837666230383066623865646331326463646136346438386438613036343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Artur\u003C\u002Fstrong> commented on \u003Cstrong>2017-03-18 22:57:49\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Is it possible to write a required if rule with this approach?\u003Cbr \u002F>\nI need to raise exception only if not all 3 properties are filled at the same time. When none of them is filled, I don't want to raise exception.\u003C\u002Fp>\n\u003Cp>Could you help me?\u003Cbr \u002F>\nThanks in advance\u003C\u002Fp>","2020-05-12T10:50:45Z",{"login":430,"avatar_url":431,"html_url":432},{"url":620,"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\u002F627266327\u002Freactions",{"id":622,"html_url":623,"body_html":624,"created_at":625,"updated_at":625,"author_association":428,"user":626,"reactions":627},627266376,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266376","\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-03-23 16:34:05\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Is it possible to write a required if rule with this approach?\u003Cbr \u002F>\nI need to raise exception only if not all 3 properties are filled at the same time. When none of them is filled, I don't want to raise exception.\u003C\u002Fp>\n\u003Cp>Could you help me?\u003Cbr \u002F>\nThanks in advance\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Something like this? You can refer to other properties in the rule condition.\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>myviewmodel\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\n    \u003Cspan>\"Item\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n    \u003Cspan>\"Item cannot be empty.\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n    x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SomeOtherProperty\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>||\u003C\u002Fspan> \u003Cspan>!\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrEmpty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Item\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>","2020-05-12T10:50:52Z",{"login":430,"avatar_url":431,"html_url":432},{"url":628,"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\u002F627266376\u002Freactions",{"id":630,"html_url":631,"body_html":632,"created_at":633,"updated_at":633,"author_association":428,"user":634,"reactions":635},627266437,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266437","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc47007062c7e7354a8088b555d2fd18fc4635bb1eeeff946d5ecbc75fdcd69e0\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f31626265303465623963396632376332306236663535646338663635626333373f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Kevin Burns\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc47007062c7e7354a8088b555d2fd18fc4635bb1eeeff946d5ecbc75fdcd69e0\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f31626265303465623963396632376332306236663535646338663635626333373f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fwww.burnssecuritysolutions.com\u002F\">Kevin Burns\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2017-04-11 16:47:29\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>I am trying to figure out how to implement this with a ViewModel that is part of a base class.\u003C\u002Fp>\n\u003Cp>This doesn't work obviously, aside from copying the base class properties\u002Ffunctions constantly. Is there an easier way of handling this?\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>public\u003C\u002Fspan> \u003Cspan>sealed\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>AgentViewModel\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>EditorBaseViewModel\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>NotifyDataErrorInfo\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>","2020-05-12T10:50:59Z",{"login":430,"avatar_url":431,"html_url":432},{"url":636,"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\u002F627266437\u002Freactions",{"id":638,"html_url":639,"body_html":640,"created_at":641,"updated_at":641,"author_association":428,"user":642,"reactions":643},627266473,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266473","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc2fa2b5e9d3cd2cb9f688507bf4f90d232a7e1d83a7c9101667a3b25dc8a368e\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32303930616532616537653865303333623235663530313932396639396439393f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Ole\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc2fa2b5e9d3cd2cb9f688507bf4f90d232a7e1d83a7c9101667a3b25dc8a368e\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32303930616532616537653865303333623235663530313932396639396439393f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Ole\u003C\u002Fstrong> commented on \u003Cstrong>2017-10-17 16:07:08\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Nice article. Looks very clean. How do you handle issues where you have one or more 'related' properties? if you update one property, you need to trigger a validation of the related property(ies), because they could be invalid because of the update.\u003C\u002Fp>","2020-05-12T10:51:06Z",{"login":430,"avatar_url":431,"html_url":432},{"url":644,"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\u002F627266473\u002Freactions",{"id":646,"html_url":647,"body_html":648,"created_at":649,"updated_at":649,"author_association":428,"user":650,"reactions":651},627266510,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266510","\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-10-18 09:21:41\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Nice article. Looks very clean. How do you handle issues where you have one or more 'related' properties? if you update one property, you need to trigger a validation of the related property(ies), because they could be invalid because of the update.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>You can pass multiple property names to both the \u003Ccode>SetProperty\u003C\u002Fcode> and \u003Ccode>OnPropertyChanged\u003C\u002Fcode> methods. To avoid using strings, you can use the nameof keyword.\u003C\u002Fp>","2020-05-12T10:51:13Z",{"login":430,"avatar_url":431,"html_url":432},{"url":652,"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\u002F627266510\u002Freactions",{"id":654,"html_url":655,"body_html":656,"created_at":657,"updated_at":657,"author_association":428,"user":658,"reactions":659},627266555,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266555","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F4015b5cab331a012ffe0f6f14fecd62f6953bf42187912b6522d651d259b10ba\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f64656663643064353432393165393834393635346130373437623335313062393f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Kevin Burns\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F4015b5cab331a012ffe0f6f14fecd62f6953bf42187912b6522d651d259b10ba\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f64656663643064353432393165393834393635346130373437623335313062393f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Kevin Burns\u003C\u002Fstrong> commented on \u003Cstrong>2017-11-07 21:55:21\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Is there anyone to implement this properly for a \u003Ccode>Collection\u003C\u002Fcode> count? I have an observable collection, and the rule is setup to throw when the \u003Ccode>count &lt;= 0\u003C\u002Fcode>. It is showing an error around the listbox bound to the collection, even when the itemsource has items in it. Any ideas?\u003C\u002Fp>","2020-05-12T10:51:20Z",{"login":430,"avatar_url":431,"html_url":432},{"url":660,"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\u002F627266555\u002Freactions",{"id":662,"html_url":663,"body_html":664,"created_at":665,"updated_at":665,"author_association":428,"user":666,"reactions":667},627266610,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266610","\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:19:51\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Is there anyone to implement this properly for a \u003Ccode>Collection\u003C\u002Fcode> count? I have an observable collection, and the rule is setup to throw when the \u003Ccode>count &lt;= 0\u003C\u002Fcode>. It is showing an error around the listbox bound to the collection, even when the itemsource has items in it. Any ideas?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>You don't say it but probably the problem you are having is that you are not calling \u003Ccode>OnPropertyChanged(\"Count\")\u003C\u002Fcode> which will cause the validation logic to get called and the listbox to update.\u003C\u002Fp>","2020-05-12T10:51:27Z",{"login":430,"avatar_url":431,"html_url":432},{"url":668,"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\u002F627266610\u002Freactions",{"id":670,"html_url":671,"body_html":672,"created_at":673,"updated_at":673,"author_association":428,"user":674,"reactions":675},627266652,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266652","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fa45f0789cd9467859ac6d1862e3c8237ff3683244fca4f9b3c5d16a3acb4cea1\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f33323639326136326262393266313564613936623366306533663262393133613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Max\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fa45f0789cd9467859ac6d1862e3c8237ff3683244fca4f9b3c5d16a3acb4cea1\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f33323639326136326262393266313564613936623366306533663262393133613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Max\u003C\u002Fstrong> commented on \u003Cstrong>2018-01-23 11:31:47\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Very nice approach!\u003Cbr \u002F>\nI have a ViewModel that contains a list of Sub-ViewModels and that has to be erroneous if any of them has an error. What would be the right approach to fire \u003Ccode>ErrorsChanged\u003C\u002Fcode> on the upper ViewModel when any of the Sub-ViewModels raises \u003Ccode>WhenErrorsChanged\u003C\u002Fcode>?\u003C\u002Fp>","2020-05-12T10:51:34Z",{"login":430,"avatar_url":431,"html_url":432},{"url":676,"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\u002F627266652\u002Freactions",{"id":678,"html_url":679,"body_html":680,"created_at":681,"updated_at":681,"author_association":428,"user":682,"reactions":683},627266698,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266698","\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>2018-01-23 12:21:26\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Very nice approach!\u003Cbr \u002F>\nI have a ViewModel that contains a list of Sub-ViewModels and that has to be erroneous if any of them has an error. What would be the right approach to fire \u003Ccode>ErrorsChanged\u003C\u002Fcode> on the upper ViewModel when any of the Sub-ViewModels raises \u003Ccode>WhenErrorsChanged\u003C\u002Fcode>?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I've done this in a few ways myself. Ideally each class is encapsulated and you register for the childs \u003Ccode>ErrorsChanged\u003C\u002Fcode> event and bubble it up manually.\u003C\u002Fp>","2020-05-12T10:51:40Z",{"login":430,"avatar_url":431,"html_url":432},{"url":684,"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\u002F627266698\u002Freactions",{"id":686,"html_url":687,"body_html":688,"created_at":689,"updated_at":689,"author_association":428,"user":690,"reactions":691},627266746,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266746","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fa45f0789cd9467859ac6d1862e3c8237ff3683244fca4f9b3c5d16a3acb4cea1\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f33323639326136326262393266313564613936623366306533663262393133613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Max\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fa45f0789cd9467859ac6d1862e3c8237ff3683244fca4f9b3c5d16a3acb4cea1\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f33323639326136326262393266313564613936623366306533663262393133613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Max\u003C\u002Fstrong> commented on \u003Cstrong>2018-01-23 12:39:40\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>I've done this in a few ways myself. Ideally each class is encapsulated and you register for the childs \u003Ccode>ErrorsChanged\u003C\u002Fcode> event and bubble it up manually.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I've already subscribed to the \u003Ccode>WhenErrorsChanged\u003C\u002Fcode> of my Sub-ViewModels, but I don't see how to trigger the \u003Ccode>WhenErrorsChanged\u003C\u002Fcode> of the upper ViewModel.\u003Cbr \u002F>\nRaising \u003Ccode>ErrorsChanged\u003C\u002Fcode> requires \u003Ccode>DataErrorsChangedEventArgs\u003C\u002Fcode> with property name, which I don't have.\u003C\u002Fp>","2020-05-12T10:51:47Z",{"login":430,"avatar_url":431,"html_url":432},{"url":692,"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\u002F627266746\u002Freactions",{"id":694,"html_url":695,"body_html":696,"created_at":697,"updated_at":697,"author_association":428,"user":698,"reactions":699},627266799,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266799","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fd296e7ac36d57386ed87baf67a54c24b170c538418996ca592354b7df74896d7\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f31613161333164396237396333393731373464343137323434643038643135323f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Ollie\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fd296e7ac36d57386ed87baf67a54c24b170c538418996ca592354b7df74896d7\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f31613161333164396237396333393731373464343137323434643038643135323f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Ollie\u003C\u002Fstrong> commented on \u003Cstrong>2018-02-21 08:14:57\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Referring to Kevin Burns's question from April 11th of 2017: I'm also curious about how this can be solved.\u003C\u002Fp>","2020-05-12T10:51:54Z",{"login":430,"avatar_url":431,"html_url":432},{"url":700,"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\u002F627266799\u002Freactions",{"id":702,"html_url":703,"body_html":704,"created_at":705,"updated_at":705,"author_association":428,"user":706,"reactions":707},627266863,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266863","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F0c8da6d2eaf92feae9937d9edab1e1b45e2a4bd18a9f604a07e312acb2307230\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32666138613935323038323934343931303130626637333238663730393338363f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Fred\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F0c8da6d2eaf92feae9937d9edab1e1b45e2a4bd18a9f604a07e312acb2307230\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32666138613935323038323934343931303130626637333238663730393338363f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Fred\u003C\u002Fstrong> commented on \u003Cstrong>2019-04-05 08:23:52\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hey Rehan,\u003C\u002Fp>\n\u003Cp>thank you for your work on this!\u003C\u002Fp>\n\u003Cp>My question is, if it is possible to use the \"old school\" C# events instead of the Rx events? So how to replace the \u003Ccode>IObservable WhenErrorsChanged\u003C\u002Fcode> with the defualt C# events. I'm not sure if I want to use the Rx Framework just for the \u003Ccode>Observable\u003C\u002Fcode> class.\u003C\u002Fp>\n\u003Cp>Thanks\u003Cbr \u002F>\nFred\u003C\u002Fp>","2020-05-12T10:52:01Z",{"login":430,"avatar_url":431,"html_url":432},{"url":708,"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\u002F627266863\u002Freactions",{"id":710,"html_url":711,"body_html":712,"created_at":713,"updated_at":713,"author_association":428,"user":714,"reactions":715},627266909,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266909","\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-04-05 09:15:35\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hey Rehan,\u003C\u002Fp>\n\u003Cp>thank you for your work on this!\u003C\u002Fp>\n\u003Cp>My question is, if it is possible to use the \"old school\" C# events instead of the Rx events? So how to replace the \u003Ccode>IObservable WhenErrorsChanged\u003C\u002Fcode> with the defualt C# events. I'm not sure if I want to use the Rx Framework just for the \u003Ccode>Observable\u003C\u002Fcode> class.\u003C\u002Fp>\n\u003Cp>Thanks\u003Cbr \u002F>\nFred\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>If you're familiar with C# events, you can easily plug them in, in place of the Rx equivalents.\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>public\u003C\u002Fspan> \u003Cspan>event\u003C\u002Fspan> \u003Cspan>EventHandler\u003C\u002Fspan> Foo\u003Cspan>;\u003C\u002Fspan>\n\n\u003Cspan>public\u003C\u002Fspan> \u003Cspan>void\u003C\u002Fspan> \u003Cspan>OnFoo\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Foo\u003C\u002Fspan>\u003Cspan>?\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Invoke\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>this\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>EventArgs\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Empty\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>","2020-05-12T10:52:08Z",{"login":430,"avatar_url":431,"html_url":432},{"url":716,"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\u002F627266909\u002Freactions",{"id":718,"html_url":719,"body_html":720,"created_at":721,"updated_at":721,"author_association":428,"user":722,"reactions":723},627266951,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627266951","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Facd0453fd505a01b734e018db53f1f9faf9c3257e0e6fb2a0c38949191f181eb\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f66353637623262666166393861313939666565366462363162663730636462613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Thavious\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Facd0453fd505a01b734e018db53f1f9faf9c3257e0e6fb2a0c38949191f181eb\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f66353637623262666166393861313939666565366462363162663730636462613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Thavious\u003C\u002Fstrong> commented on \u003Cstrong>2019-05-17 15:03:36\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Why did you implement this set of rules, rather than using something existing like DataAnnotations?\u003C\u002Fp>","2020-05-12T10:52:15Z",{"login":430,"avatar_url":431,"html_url":432},{"url":724,"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\u002F627266951\u002Freactions",{"id":726,"html_url":727,"body_html":728,"created_at":729,"updated_at":729,"author_association":428,"user":730,"reactions":731},627267011,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267011","\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-06-11 12:31:52\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Why did you implement this set of rules, rather than using something existing like DataAnnotations?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I prefer functions over attributes. They are more powerful, simpler to reason about and faster.\u003C\u002Fp>","2020-05-12T10:52:23Z",{"login":430,"avatar_url":431,"html_url":432},{"url":732,"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\u002F627267011\u002Freactions",{"id":734,"html_url":735,"body_html":736,"created_at":737,"updated_at":737,"author_association":428,"user":738,"reactions":739},627267060,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267060","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F298a985f5f49b6a9f549a963dbd65c62f25542728c4f8a875572cd8e0dc71905\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f63653332373830323238396130646238393664313034653333343363656536363f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Remy Meier\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F298a985f5f49b6a9f549a963dbd65c62f25542728c4f8a875572cd8e0dc71905\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f63653332373830323238396130646238393664313034653333343363656536363f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Remy Meier\u003C\u002Fstrong> commented on \u003Cstrong>2019-06-12 21:53:06\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Quite good coded and commented. My Visual Studio shows me an error for \u003Ccode>Observable\u003C\u002Fcode>. This cannot find the class. Which part of the .NET framework is to use for using?\u003C\u002Fp>","2020-05-12T10:52:29Z",{"login":430,"avatar_url":431,"html_url":432},{"url":740,"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\u002F627267060\u002Freactions",{"id":742,"html_url":743,"body_html":744,"created_at":745,"updated_at":745,"author_association":428,"user":746,"reactions":747},627267108,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267108","\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-06-15 10:38:39\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Quite good coded and commented. My Visual Studio shows me an error for \u003Ccode>Observable\u003C\u002Fcode>. This cannot find the class. Which part of the .NET framework is to use for using?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>You can find that in the \u003Ccode>System.Reactive\u003C\u002Fcode> package.\u003C\u002Fp>","2020-05-12T10:52:36Z",{"login":430,"avatar_url":431,"html_url":432},{"url":748,"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\u002F627267108\u002Freactions",{"id":750,"html_url":751,"body_html":752,"created_at":753,"updated_at":753,"author_association":428,"user":754,"reactions":755},627267155,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267155","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F470ac41a657776f88a813efa683531bfd622e174abaffc0496c80fb6bcf79fe2\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f65346139393537353038616131626462313630313837393363666331626234303f733d393626643d6d6d26723d67\">\u003Cimg alt=\"David Piepgrass\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F470ac41a657776f88a813efa683531bfd622e174abaffc0496c80fb6bcf79fe2\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f65346139393537353038616131626462313630313837393363666331626234303f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fdavid.loyc.net\u002F\">David Piepgrass\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2019-07-31 22:45:44\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>This is all very nice, but how do you write the corresponding XAML for the view?\u003C\u002Fp>","2020-05-12T10:52:43Z",{"login":430,"avatar_url":431,"html_url":432},{"url":756,"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\u002F627267155\u002Freactions",{"id":758,"html_url":759,"body_html":760,"created_at":761,"updated_at":761,"author_association":428,"user":762,"reactions":763},627267192,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267192","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F893e29bd07885fc82ddc6a6e65d630c4552bb7afcd7a693932d9c6fb54dd8cfa\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f61336435366639643432653165346331383634336231393436653639646136363f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Pete\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F893e29bd07885fc82ddc6a6e65d630c4552bb7afcd7a693932d9c6fb54dd8cfa\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f61336435366639643432653165346331383634336231393436653639646136363f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Pete\u003C\u002Fstrong> commented on \u003Cstrong>2019-09-04 16:43:41\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>I love this implementation to establish rules but I have an issue.\u003C\u002Fp>\n\u003Cp>I have added rules to my tblCompany model for when creating a new Company the rules ensure the relevant information is added. Although when I use a List as an Itemssource for a Combobox the rules are still in affect. So when a Company is selected the Combobox goes red if one of the rules aren't met. I would like to be able to ignore the rules on the model in some certain circumstances if possible??\u003C\u002Fp>","2020-05-12T10:52:50Z",{"login":430,"avatar_url":431,"html_url":432},{"url":764,"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\u002F627267192\u002Freactions",{"id":766,"html_url":767,"body_html":768,"created_at":769,"updated_at":769,"author_association":428,"user":770,"reactions":771},627267239,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267239","\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-09-23 09:02:22\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>I love this implementation to establish rules but I have an issue.\u003C\u002Fp>\n\u003Cp>I have added rules to my tblCompany model for when creating a new Company the rules ensure the relevant information is added. Although when I use a List as an Itemssource for a Combobox the rules are still in affect. So when a Company is selected the Combobox goes red if one of the rules aren't met. I would like to be able to ignore the rules on the model in some certain circumstances if possible??\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Sure they can be ignored. Just add a property to the view model called something like \u003Ccode>IsValidationEnabled\u003C\u002Fcode>. When it is false, make all your rules valid. When it is true, then run the code in your rules as normal.\u003C\u002Fp>","2020-05-12T10:52:57Z",{"login":430,"avatar_url":431,"html_url":432},{"url":772,"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\u002F627267239\u002Freactions",{"id":774,"html_url":775,"body_html":776,"created_at":777,"updated_at":777,"author_association":428,"user":778,"reactions":779},627267292,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267292","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F250f2c91bd57a788f4beabdc3ecd9e193fe18aff9e5e74cce47502662ac59055\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38666565366635393163636562653436316164656436396234633866343066613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"MarkusB\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F250f2c91bd57a788f4beabdc3ecd9e193fe18aff9e5e74cce47502662ac59055\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38666565366635393163636562653436316164656436396234633866343066613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>MarkusB\u003C\u002Fstrong> commented on \u003Cstrong>2019-10-08 09:11:15\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Very nice solution!\u003Cbr \u002F>\nBut i have a problem with inherited classes.\u003C\u002Fp>\n\u003Cp>I've created a BaseClass named \u003Ccode>NotifyDataErrorInfo\u003C\u002Fcode> like you and a Class\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>public\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>ValidationExample\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>NotifyDataErrorInfoBase\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>ValidationExample\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>All works great.\u003C\u002Fp>\n\u003Cp>Now i want another inherited class\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>public\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>ValidationDerivedExample\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>ValidationExample\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>int\u003C\u002Fspan> \u003Cspan>_subVar\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>int\u003C\u002Fspan> \u003Cspan>SubVar\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_subVar\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_subVar\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>\"SubVar\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\n    \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>ValidationDerivedExample\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>ValidationDerivedExample\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\n            \u003Cspan>\"SubVar\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n            \u003Cspan>\"SubVar cannot be &lt; 0.\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n            x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SubVar\u003C\u002Fspan> \u003Cspan>&lt;\u003C\u002Fspan> \u003Cspan>0\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>And add Rules -&gt; that doesn't work\u003Cbr \u002F>\nCan you give me please an advice.\u003C\u002Fp>","2020-05-12T10:53:04Z",{"login":430,"avatar_url":431,"html_url":432},{"url":780,"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\u002F627267292\u002Freactions",{"id":782,"html_url":783,"body_html":784,"created_at":785,"updated_at":785,"author_association":428,"user":786,"reactions":787},627267329,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267329","\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-10-10 20:11:28\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Very nice solution!\u003Cbr \u002F>\nBut i have a problem with inherited classes.\u003C\u002Fp>\n\u003Cp>I've created a BaseClass named \u003Ccode>NotifyDataErrorInfo\u003C\u002Fcode> like you and a Class\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>public\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>ValidationExample\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>NotifyDataErrorInfoBase\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>ValidationExample\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>All works great.\u003C\u002Fp>\n\u003Cp>Now i want another inherited class\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>public\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>ValidationDerivedExample\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>ValidationExample\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>private\u003C\u002Fspan> \u003Cspan>int\u003C\u002Fspan> \u003Cspan>_subVar\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n    \u003Cspan>public\u003C\u002Fspan> \u003Cspan>int\u003C\u002Fspan> \u003Cspan>SubVar\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>get\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_subVar\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>set\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SetProperty\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ref\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>_subVar\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>\"SubVar\"\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\n    \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>ValidationDerivedExample\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>ValidationDerivedExample\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\n            \u003Cspan>\"SubVar\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n            \u003Cspan>\"SubVar cannot be &lt; 0.\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n            x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SubVar\u003C\u002Fspan> \u003Cspan>&lt;\u003C\u002Fspan> \u003Cspan>0\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>And add Rules -&gt; that doesn't work\u003Cbr \u002F>\nCan you give me please an advice.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Yes it gets a bit tricky here. I can't remember what my goto solution was but you can fix this in a couple of ways. You can cast in the rule:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>Rules\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Add\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>DelegateRule\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>ValidationExample\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\n    \u003Cspan>\"SubVar\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n    \u003Cspan>\"SubVar cannot be &lt; 0.\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan>\n    x \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>ValidationDerivedExample\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>x\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>SubVar\u003C\u002Fspan> \u003Cspan>&lt;\u003C\u002Fspan> \u003Cspan>0\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Or you can move the generic type up the chain:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>public\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>ValidationExample\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>T\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>NotifyDataErrorInfoBase\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>T\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\n    \u003Cspan>where\u003C\u002Fspan> \u003Cspan>T\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>ValidationSubExample\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\n\n\u003Cspan>public\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>ValidationDerivedExample\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>ValidationExample\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>ValidationDerivedExample\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>","2020-05-12T10:53:11Z",{"login":430,"avatar_url":431,"html_url":432},{"url":788,"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\u002F627267329\u002Freactions",{"id":790,"html_url":791,"body_html":792,"created_at":793,"updated_at":794,"author_association":428,"user":795,"reactions":796},627267369,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267369","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F250f2c91bd57a788f4beabdc3ecd9e193fe18aff9e5e74cce47502662ac59055\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38666565366635393163636562653436316164656436396234633866343066613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"MarkusB\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F250f2c91bd57a788f4beabdc3ecd9e193fe18aff9e5e74cce47502662ac59055\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38666565366635393163636562653436316164656436396234633866343066613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>MarkusB\u003C\u002Fstrong> commented on \u003Cstrong>2019-10-11 08:21:32\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Yes it gets a bit tricky here. I can't remember what my goto solution was but you can fix this in a couple of ways. You can cast in the rule:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Ccode>Rules.Add(new DelegateRule&lt;ValidationExample&gt; (\n    \"SubVar\",\n    \"SubVar cannot be &lt; 0.\",\n    x =&gt; (((ValidationDerivedExample)x).SubVar &lt; 0));\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Or you can move the generic type up the chain:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Ccode>public class ValidationExample&lt;T&gt; : NotifyDataErrorInfoBase&lt;T&gt;\n    where T : ValidationSubExample\n{\n}\n\npublic class ValidationDerivedExample : ValidationExample&lt;ValidationDerivedExample&gt;\n{\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fblockquote>\n\u003Cp>Hello Rehan,\u003C\u002Fp>\n\u003Cp>thanks for the fast reply.\u003C\u002Fp>\n\u003Cp>Casting the rule i tried befor, unfortunately it doesn't work on runtime, i get an error at\u003Cbr \u002F>\n\u003Ccode>Rules.Add(ValidationDerivedExample)\u003C\u002Fcode> because \u003Ccode>x\u003C\u002Fcode> is not of type \u003Ccode>ValidationExample\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>And move up the chain, is also no solution, because i want the error handly in my 'base classes' too.\u003C\u002Fp>\n\u003Cp>Is there a possible solution without the generic type in the \u003Ccode>rule\u003C\u002Fcode>, \u003Ccode>delegateRule\u003C\u002Fcode> and \u003Ccode>ruleCollection\u003C\u002Fcode>?\u003C\u002Fp>","2020-05-12T10:53:18Z","2020-05-12T11:50:48Z",{"login":430,"avatar_url":431,"html_url":432},{"url":797,"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\u002F627267369\u002Freactions",{"id":799,"html_url":800,"body_html":801,"created_at":802,"updated_at":803,"author_association":428,"user":804,"reactions":805},627267429,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267429","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F6f17a85afececc591912c0b1d2eeb02e0e33f9dcec785e6e2e905f69f97694b2\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f63656265363162326437306138643666303762336166383662643732306464663f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Kiwi\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F6f17a85afececc591912c0b1d2eeb02e0e33f9dcec785e6e2e905f69f97694b2\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f63656265363162326437306138643666303762336166383662643732306464663f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Kiwi\u003C\u002Fstrong> commented on \u003Cstrong>2019-10-11 13:39:09\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>I'm working on a personal project and I'm using your example code, but I'm calling \u003Ccode>NotifyDataErrorInfo\u003C\u002Fcode> \u003Ccode>ModelBase\u003C\u002Fcode> because I want my models to implement the \u003Ccode>INotifyDataError\u003C\u002Fcode> and the \u003Ccode>INotifyPropertyChanged\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>From my limited knowledge of MVVM, if I want the models to implement the INotify interfaces, and I want my ViewModels to wrap around the models (and not just be a pass-through), I need to have the ViewModel intercept the model's notify event, and re-raise those events.\u003C\u002Fp>\n\u003Cp>I don't have a 1 to 1 Model to ViewModel ratio - I have a 1 to Many Model to ViewModel ratio. I'm not sure if this is a bad design decision, but I want the models to stay alive longer than the ViewModels they will be passed to, so for that I also new weak event handlers in my ViewModels coupling to my model's notify events. To accomplish, I have made the following \u003Ccode>ViewModelBase\u003C\u002Fcode> class:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>namespace\u003C\u002Fspan> \u003Cspan>MyNamespace\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ViewModels\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>abstract\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>ViewModelBase\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>Models\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ModelBase\u003C\u002Fspan> \u003Cspan>where\u003C\u002Fspan> \u003Cspan>T\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>ViewModelBase\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>private\u003C\u002Fspan> \u003Cspan>object\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>models\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>private\u003C\u002Fspan> \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>readonly\u003C\u002Fspan> \u003Cspan>Dictionary\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>Type\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan> \u003Cspan>propertyMappings\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>new\u003C\u002Fspan> \u003Cspan>Dictionary\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>Type\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n        \u003Cspan>protected\u003C\u002Fspan> \u003Cspan>object\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>Models\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>get\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>private\u003C\u002Fspan> \u003Cspan>set\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n\n        \u003Cspan>protected\u003C\u002Fspan> \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>Dictionary\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>Type\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan> \u003Cspan>PropertyMappings\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>get\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>propertyMappings\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n\n        \u003Cspan>private\u003C\u002Fspan> \u003Cspan>void\u003C\u002Fspan> \u003Cspan>Model_ErrorsChanged\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan> \u003Cspan>sender\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>DataErrorsChangedEventArgs\u003C\u002Fspan> \u003Cspan>e\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>string\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>e\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>PropertyName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>PropertyMappings\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ContainsKey\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>sender\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>PropertyMappings\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>sender\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>\u002F\u002F If PropertyMappings returned a null property name, that means skip the property.\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrWhiteSpace\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>\u002F\u002F Re-raise property changed event. Chain of events are: Model.ErrorsChanged(Model.Property) -&gt; ViewModel.ErrorsChanged(ViewModel.Property).\u003C\u002Fspan>\n            \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>OnErrorsChanged\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n\n        \u003Cspan>private\u003C\u002Fspan> \u003Cspan>void\u003C\u002Fspan> \u003Cspan>Model_PropertyChanged\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan> \u003Cspan>sender\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>PropertyChangedEventArgs\u003C\u002Fspan> \u003Cspan>e\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>string\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>e\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>PropertyName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>PropertyMappings\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ContainsKey\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>sender\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>PropertyMappings\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>sender\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>\u002F\u002F If PropertyMappings returned a null property name, that means skip the property.\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrWhiteSpace\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>\u002F\u002F Re-raise property changed event. Chain of events are: Model.PropertyChanged(Model.Property) -&gt; ViewModel.PropetyChanged(ViewModel.Property).\u003C\u002Fspan>\n            \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>OnPropertyChanged\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n\n        \u003Cspan>protected\u003C\u002Fspan> \u003Cspan>ViewModelBase\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan> \u003Cspan>model\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>object\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>model\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>protected\u003C\u002Fspan> \u003Cspan>ViewModelBase\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>params\u003C\u002Fspan> \u003Cspan>object\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>models\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan> \u003Cspan>==\u003C\u002Fspan> \u003Cspan>null\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>throw\u003C\u002Fspan> \u003Cspan>new\u003C\u002Fspan> \u003Cspan>ArgumentNullException\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Length\u003C\u002Fspan> \u003Cspan>&lt;\u003C\u002Fspan> \u003Cspan>1\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>throw\u003C\u002Fspan> \u003Cspan>new\u003C\u002Fspan> \u003Cspan>ArgumentException\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"At least one model is required.\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Models\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>models\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>foreach\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan> \u003Cspan>model\u003C\u002Fspan> \u003Cspan>in\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Models\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n            \u003Cspan>{\u003C\u002Fspan>\n                \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan> \u003Cspan>is\u003C\u002Fspan> \u003Cspan>INotifyPropertyChanged\u003C\u002Fspan> \u003Cspan>property\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n                    \u003Cspan>WeakEventManager\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>PropertyChangedEventArgs\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>AddHandler\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>property\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>PropertyChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Model_PropertyChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n                \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan> \u003Cspan>is\u003C\u002Fspan> \u003Cspan>INotifyDataErrorInfo\u003C\u002Fspan> \u003Cspan>data\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n                    \u003Cspan>WeakEventManager\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>DataErrorsChangedEventArgs\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>AddHandler\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>data\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ErrorsChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Model_ErrorsChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n\n        \u003Cspan>protected\u003C\u002Fspan> \u003Cspan>override\u003C\u002Fspan> \u003Cspan>void\u003C\u002Fspan> \u003Cspan>DisposeManaged\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>foreach\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan> \u003Cspan>model\u003C\u002Fspan> \u003Cspan>in\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Models\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n            \u003Cspan>{\u003C\u002Fspan>\n                \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan> \u003Cspan>is\u003C\u002Fspan> \u003Cspan>INotifyPropertyChanged\u003C\u002Fspan> \u003Cspan>property\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n                    \u003Cspan>WeakEventManager\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>PropertyChangedEventArgs\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>RemoveHandler\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>property\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>PropertyChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Model_PropertyChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n                \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan> \u003Cspan>is\u003C\u002Fspan> \u003Cspan>INotifyDataErrorInfo\u003C\u002Fspan> \u003Cspan>data\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n                    \u003Cspan>WeakEventManager\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>DataErrorsChangedEventArgs\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>RemoveHandler\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>data\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ErrorsChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Model_ErrorsChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>So if my design isn't complete garbage, it should be able to have ViewModels that extend this \u003Ccode>ViewModelBase\u003C\u002Fcode> that are tied to 1 or more object models that may or may not implement the INotify interfaces. It should also be weakly bound to those events, allowing the ViewModels to GCed when the View they are attached to leaves the scope.\u003C\u002Fp>\n\u003Cp>One part I'm a little iffy on is Dictionary&lt;(Type, string), string&gt; and how it will work with sub classes. I'm not overly worried about it because my small personal project shouldn't have any models that have sub classes (beyond the initial ModelBase). IE, I won't have \"class Model1 : ModelBase\" + \"class SubModelA : Model1\" - I'll only have the \"Model1\" class in that example, and not the \"SubModelA\". It would be nice if I had designed Dictionary&lt;(Type, string), string&gt; to work correctly whether the object raising the event was subclass or not - but I only plan on crossing that bridge when I have to (which currently seems unlikely - at least in this personal project).\u003C\u002Fp>\n\u003Cp>Anyway, thank you for your articles - I found them very informative. I shared the above class in the hopes that if you have 5 minutes, you'll share any thoughts \u002F wisdom you have on my approach. If not, no biggie. I'm sure I'll find the hidden gotchas once I start debugging the project.\u003C\u002Fp>","2020-05-12T10:53:24Z","2020-05-12T11:51:00Z",{"login":430,"avatar_url":431,"html_url":432},{"url":806,"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\u002F627267429\u002Freactions",{"id":808,"html_url":809,"body_html":810,"created_at":811,"updated_at":812,"author_association":428,"user":813,"reactions":814},627267474,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267474","\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-10-12 10:20:10\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hello Rehan,\u003C\u002Fp>\n\u003Cp>thanks for the fast reply.\u003C\u002Fp>\n\u003Cp>Casting the rule i tried before, unfortunately it doesn't work on runtime, i get an error at\u003Cbr \u002F>\nRules.Add (ValidationDerivedExample)x is not of type ValidationExample\u003C\u002Fp>\n\u003Cp>and move up the chain, is also no solution, because i want the error handy in my 'base classes' too.\u003C\u002Fp>\n\u003Cp>Is there a possible solution without the generic type in the \u003Ccode>rule\u003C\u002Fcode>, \u003Ccode>delegateRule\u003C\u002Fcode> and \u003Ccode>ruleCollection\u003C\u002Fcode> ?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>You should be able to specify rules in both classes using the generics solution.\u003C\u002Fp>","2020-05-12T10:53:32Z","2020-05-12T11:51:16Z",{"login":430,"avatar_url":431,"html_url":432},{"url":815,"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\u002F627267474\u002Freactions",{"id":817,"html_url":818,"body_html":819,"created_at":820,"updated_at":821,"author_association":428,"user":822,"reactions":823},627267525,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267525","\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-10-12 10:26:31\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>I'm working on a personal project and I'm using your example code, but I'm calling \u003Ccode>NotifyDataErrorInfo\u003C\u002Fcode> \u003Ccode>ModelBase\u003C\u002Fcode> because I want my models to implement the \u003Ccode>INotifyDataError\u003C\u002Fcode> and the \u003Ccode>INotifyPropertyChanged\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>From my limited knowledge of MVVM, if I want the models to implement the INotify interfaces, and I want my ViewModels to wrap around the models (and not just be a pass-through), I need to have the ViewModel intercept the model's notify event, and re-raise those events.\u003C\u002Fp>\n\u003Cp>I don't have a 1 to 1 Model to ViewModel ratio - I have a 1 to Many Model to ViewModel ratio. I'm not sure if this is a bad design decision, but I want the models to stay alive longer than the ViewModels they will be passed to, so for that I also new weak event handlers in my ViewModels coupling to my model's notify events. To accomplish, I have made the following \u003Ccode>ViewModelBase\u003C\u002Fcode> class:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>namespace\u003C\u002Fspan> \u003Cspan>MyNamespace\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ViewModels\u003C\u002Fspan>\n\u003Cspan>{\u003C\u002Fspan>\n    \u003Cspan>abstract\u003C\u002Fspan> \u003Cspan>class\u003C\u002Fspan> \u003Cspan>ViewModelBase\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>Models\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ModelBase\u003C\u002Fspan> \u003Cspan>where\u003C\u002Fspan> \u003Cspan>T\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>ViewModelBase\u003C\u002Fspan>\n    \u003Cspan>{\u003C\u002Fspan>\n        \u003Cspan>private\u003C\u002Fspan> \u003Cspan>object\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>models\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>private\u003C\u002Fspan> \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>readonly\u003C\u002Fspan> \u003Cspan>Dictionary\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>Type\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan> \u003Cspan>propertyMappings\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>new\u003C\u002Fspan> \u003Cspan>Dictionary\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>Type\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n        \u003Cspan>protected\u003C\u002Fspan> \u003Cspan>object\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>Models\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>get\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>private\u003C\u002Fspan> \u003Cspan>set\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>value\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n\n        \u003Cspan>protected\u003C\u002Fspan> \u003Cspan>\u003Cspan>static\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan>Dictionary\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>Type\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>string\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan> \u003Cspan>PropertyMappings\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>get\u003C\u002Fspan> \u003Cspan>=&gt;\u003C\u002Fspan> \u003Cspan>propertyMappings\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n\n        \u003Cspan>private\u003C\u002Fspan> \u003Cspan>void\u003C\u002Fspan> \u003Cspan>Model_ErrorsChanged\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan> \u003Cspan>sender\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>DataErrorsChangedEventArgs\u003C\u002Fspan> \u003Cspan>e\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>string\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>e\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>PropertyName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>PropertyMappings\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ContainsKey\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>sender\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>PropertyMappings\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>sender\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>\u002F\u002F If PropertyMappings returned a null property name, that means skip the property.\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrWhiteSpace\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>\u002F\u002F Re-raise property changed event. Chain of events are: Model.ErrorsChanged(Model.Property) -&gt; ViewModel.ErrorsChanged(ViewModel.Property).\u003C\u002Fspan>\n            \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>OnErrorsChanged\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n\n        \u003Cspan>private\u003C\u002Fspan> \u003Cspan>void\u003C\u002Fspan> \u003Cspan>Model_PropertyChanged\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan> \u003Cspan>sender\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>PropertyChangedEventArgs\u003C\u002Fspan> \u003Cspan>e\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>string\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>e\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>PropertyName\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>PropertyMappings\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ContainsKey\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>sender\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>PropertyMappings\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>sender\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>GetType\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>\u002F\u002F If PropertyMappings returned a null property name, that means skip the property.\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>string\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>IsNullOrWhiteSpace\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>return\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>\u002F\u002F Re-raise property changed event. Chain of events are: Model.PropertyChanged(Model.Property) -&gt; ViewModel.PropetyChanged(ViewModel.Property).\u003C\u002Fspan>\n            \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>OnPropertyChanged\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>propertyName\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n\n        \u003Cspan>protected\u003C\u002Fspan> \u003Cspan>ViewModelBase\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan> \u003Cspan>model\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>:\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>new\u003C\u002Fspan> \u003Cspan>object\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>model\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>{\u003C\u002Fspan> \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>protected\u003C\u002Fspan> \u003Cspan>ViewModelBase\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>params\u003C\u002Fspan> \u003Cspan>object\u003C\u002Fspan>\u003Cspan>[\u003C\u002Fspan>\u003Cspan>]\u003C\u002Fspan> \u003Cspan>models\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan> \u003Cspan>==\u003C\u002Fspan> \u003Cspan>null\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>throw\u003C\u002Fspan> \u003Cspan>new\u003C\u002Fspan> \u003Cspan>ArgumentNullException\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Length\u003C\u002Fspan> \u003Cspan>&lt;\u003C\u002Fspan> \u003Cspan>1\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan> \u003Cspan>throw\u003C\u002Fspan> \u003Cspan>new\u003C\u002Fspan> \u003Cspan>ArgumentException\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>\"At least one model is required.\"\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>models\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Models\u003C\u002Fspan> \u003Cspan>=\u003C\u002Fspan> \u003Cspan>models\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n\n            \u003Cspan>foreach\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan> \u003Cspan>model\u003C\u002Fspan> \u003Cspan>in\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Models\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n            \u003Cspan>{\u003C\u002Fspan>\n                \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan> \u003Cspan>is\u003C\u002Fspan> \u003Cspan>INotifyPropertyChanged\u003C\u002Fspan> \u003Cspan>property\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n                    \u003Cspan>WeakEventManager\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>PropertyChangedEventArgs\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>AddHandler\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>property\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>PropertyChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Model_PropertyChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n                \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan> \u003Cspan>is\u003C\u002Fspan> \u003Cspan>INotifyDataErrorInfo\u003C\u002Fspan> \u003Cspan>data\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n                    \u003Cspan>WeakEventManager\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>DataErrorsChangedEventArgs\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>AddHandler\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>data\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ErrorsChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Model_ErrorsChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n\n        \u003Cspan>protected\u003C\u002Fspan> \u003Cspan>override\u003C\u002Fspan> \u003Cspan>void\u003C\u002Fspan> \u003Cspan>DisposeManaged\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n        \u003Cspan>{\u003C\u002Fspan>\n            \u003Cspan>foreach\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan> \u003Cspan>model\u003C\u002Fspan> \u003Cspan>in\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Models\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n            \u003Cspan>{\u003C\u002Fspan>\n                \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan> \u003Cspan>is\u003C\u002Fspan> \u003Cspan>INotifyPropertyChanged\u003C\u002Fspan> \u003Cspan>property\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n                    \u003Cspan>WeakEventManager\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>PropertyChangedEventArgs\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>RemoveHandler\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>property\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>PropertyChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Model_PropertyChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n                \u003Cspan>if\u003C\u002Fspan> \u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan> \u003Cspan>is\u003C\u002Fspan> \u003Cspan>INotifyDataErrorInfo\u003C\u002Fspan> \u003Cspan>data\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\n                    \u003Cspan>WeakEventManager\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>object\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>DataErrorsChangedEventArgs\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>RemoveHandler\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>model\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>nameof\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>data\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>ErrorsChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>this\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>Model_ErrorsChanged\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\n            \u003Cspan>}\u003C\u002Fspan>\n        \u003Cspan>}\u003C\u002Fspan>\n    \u003Cspan>}\u003C\u002Fspan>\n\u003Cspan>}\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>So if my design isn't complete garbage, it should be able to have ViewModels that extend this \u003Ccode>ViewModelBase\u003C\u002Fcode> that are tied to 1 or more object models that may or may not implement the INotify interfaces. It should also be weakly bound to those events, allowing the ViewModels to GCed when the View they are attached to leaves the scope.\u003C\u002Fp>\n\u003Cp>One part I'm a little iffy on is Dictionary&lt;(Type, string), string&gt; and how it will work with sub classes. I'm not overly worried about it because my small personal project shouldn't have any models that have sub classes (beyond the initial ModelBase). IE, I won't have \"class Model1 : ModelBase\" + \"class SubModelA : Model1\" - I'll only have the \"Model1\" class in that example, and not the \"SubModelA\". It would be nice if I had designed Dictionary&lt;(Type, string), string&gt; to work correctly whether the object raising the event was subclass or not - but I only plan on crossing that bridge when I have to (which currently seems unlikely - at least in this personal project).\u003C\u002Fp>\n\u003Cp>Anyway, thank you for your articles - I found them very informative. I shared the above class in the hopes that if you have 5 minutes, you'll share any thoughts \u002F wisdom you have on my approach. If not, no biggie. I'm sure I'll find the hidden gotchas once I start debugging the project.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>These are good questions. Nobody teaches this stuff and I had a great deal of trouble trying things and finding what I thought was the best way for my purposes. I quite often ended up with two scenarios:\u003C\u002Fp>\n\u003Col>\n\u003Cli>I ended up with simple POCO model classes that don't implement the \u003Ccode>INotifyPropertyChanged\u003C\u002Fcode> interface. Then the view model wraps the properties of the model and does all the property changed stuff.\u003C\u002Fli>\n\u003Cli>In other scenarios, my model implemented \u003Ccode>INotifyPropertyChanged\u003C\u002Fcode> and my view model exposed the model as a single property.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>What you end up doing depends on your scenario. Whether you have control over the model etc. The second scenario is a bit quicker and less work but the first probably a more pure solution.\u003C\u002Fp>","2020-05-12T10:53:39Z","2020-05-12T11:51:24Z",{"login":430,"avatar_url":431,"html_url":432},{"url":824,"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\u002F627267525\u002Freactions",{"id":826,"html_url":827,"body_html":828,"created_at":829,"updated_at":829,"author_association":428,"user":830,"reactions":831},627267567,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267567","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F96383e95d5f98e4296cf5ba7235725dc4857181bdb1802855c7820d17ba5a598\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38616333326462323965356263333766326261656635373433333464373963383f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Shimmy\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F96383e95d5f98e4296cf5ba7235725dc4857181bdb1802855c7820d17ba5a598\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f38616333326462323965356263333766326261656635373433333464373963383f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Shimmy\u003C\u002Fstrong> commented on \u003Cstrong>2019-12-05 08:47:10\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Hi Rehan, I've been subscribed to your blog for a while and love it!\u003Cbr \u002F>\nI'm using ReactiveUI validation in a WPF project, and I was wondering if it's possible to keep the entities clean (I've only decorated them with data-annotations attributes or \u003Ccode>IValidatoableObject\u003C\u002Fcode> implementations), and perform all validation logic in the VM, all this while binding directly to the entities (i.e. exposing them as a whole via a property in the VM, not proxying the properties individually in the VM.\u003C\u002Fp>","2020-05-12T10:53:45Z",{"login":430,"avatar_url":431,"html_url":432},{"url":832,"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\u002F627267567\u002Freactions",{"id":834,"html_url":835,"body_html":836,"created_at":837,"updated_at":837,"author_association":428,"user":838,"reactions":839},627267623,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-627267623","\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-12-30 11:19:51\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Hi Rehan, I've been subscribed to your blog for a while and love it!\u003Cbr \u002F>\nI'm using ReactiveUI validation in a WPF project, and I was wondering if it's possible to keep the entities clean (I've only decorated them with data-annotations attributes or \u003Ccode>IValidatoableObject\u003C\u002Fcode> implementations), and perform all validation logic in the VM, all this while binding directly to the entities (i.e. exposing them as a whole via a property in the VM, not proxying the properties individually in the VM.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I'm not familiar with ReactiveUI validation. I prefer simple methods to attributes personally.\u003C\u002Fp>","2020-05-12T10:53:52Z",{"login":430,"avatar_url":431,"html_url":432},{"url":840,"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\u002F627267623\u002Freactions",{"id":842,"html_url":843,"body_html":844,"created_at":845,"updated_at":845,"author_association":846,"user":847,"reactions":851},1375371125,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F93#issuecomment-1375371125","\u003Cp>What about limiting to types like a string can only be numbers.   verifying dates, decimal inputs, etc.\u003C\u002Fp>","2023-01-09T10:07:28Z","NONE",{"login":848,"avatar_url":849,"html_url":850},"vicken78","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F113060031?v=4","https:\u002F\u002Fgithub.com\u002Fvicken78",{"url":852,"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\u002F1375371125\u002Freactions","2014-09-09T00:00:00+00:00",null,"An base class implementation for the INotifyDataErrorInfo interface. Used in the Model-View-ViewModel (MVVM) pattern. Targeted for best performance.","md",[858,860,861,862,863,864,865],{"depth":859,"value":166},1,{"depth":859,"value":240},{"depth":859,"value":297},{"depth":859,"value":318},{"depth":859,"value":364},{"depth":859,"value":386},{"depth":859,"value":403},"\u002Fimages\u002Fhero\u002FMVVM-1366x768.png",{},true,"posts\u002F2014\u002Fmodel-view-viewmodel-mvvm-part4-inotifydataerrorinfo\u002Findex",[871,872,873,874,142,875,876,87,203,877],".NET","Base Class Library","BCL","C#","Events","Explicit Interface Implementation","Model-View-ViewModel (MVVM)",12,{"left":4,"top":4,"width":26,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":880},"\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":882},"\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":884},"\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":886},"\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":888},"\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":890},"\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":892},"\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":894},"\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>",1793017676751]