{"id":64,"date":"2011-11-29T19:33:00","date_gmt":"2011-11-29T19:33:00","guid":{"rendered":"http:\/\/tpodolak.com.hostingasp.pl\/blog\/2011\/11\/29\/prism-komendy\/"},"modified":"2016-01-31T00:34:34","modified_gmt":"2016-01-31T00:34:34","slug":"prism-komendy","status":"publish","type":"post","link":"https:\/\/tpodolak.com\/blog\/2011\/11\/29\/prism-komendy\/","title":{"rendered":"Prism &#8211; Komendy"},"content":{"rendered":"<h3>1. DelegateCommands<\/h3>\n<p><span style=\"font-style: italic;\">DelegateCommands <\/span>w Prismie s\u0105 to obiekty, kt\u00f3re implementuj\u0105 interfejs <span style=\"font-style: italic;\">ICommand<\/span>, s\u0142u\u017c\u0105 one do interakcji widoku z ViewModelem. Korzystaj\u0105c z Prisma nie musimy ju\u017c pisa\u0107 w\u0142asnej klasy implementuj\u0105cej ten interfejs (tak jak to zrobili\u015bmy <a href=\"http:\/\/tpodolak.com\/blog\/2011\/11\/27\/commands-czyli-interakcja-widoku-z-viewmodelem-cz-2\/\">tutaj<\/a>). Konstruktor klasy <span style=\"font-style: italic;\">DelegateCommand <\/span>przyjmuje dwa parametry:<\/p>\n<ul>\n<li><span style=\"font-style: italic;\">Action execteMethod<\/span> &#8211; funkcja odpalania przy wywo\u0142aniu komendy,<\/li>\n<li><span style=\"font-style: italic;\">Func<bool> canExecuteMethod<\/span> &#8211; funkcja sprawdzaj\u0105ca czy dan\u0105 komend\u0119 mo\u017cna wywo\u0142a\u0107<\/li>\n<\/ul>\n<p><span style=\"font-style: italic;\">DelegateCommands<\/span> z Prisma u\u017cywamy w taki sam spos\u00f3b w jaki u\u017cywali\u015bmy komend w <a href=\"http:\/\/tpodolak.com\/blog\/2011\/11\/27\/commands-czyli-interakcja-widoku-z-viewmodelem-cz-2\">tym<\/a> po\u015bcie.<\/p>\n<h3>2. <span>CompositeCommands<\/h3>\n<p><span style=\"font-style: italic;\">CompositeCommands <\/span>s\u0105 to obiekty, kt\u00f3re przechowuj\u0105 kolekcj\u0105 obiekt\u00f3w typu DelegateCommand. Tworzenie <span style=\"font-style: italic;\">CompositeCommand <\/span>jest bardzo proste.<br \/>\nPo pierwsze musimy stworzy\u0107 obiekt typu <span style=\"font-style: italic;\">CompositeCommand<\/span><\/p>\n<pre lang=\"csharp\">\r\npublic CompositeCommand SomeCompositeCommand = new CompositeCommand();\r\n<\/pre>\n<p>nast\u0119pnie rejestrujemy w tym obiekcie obiekt implementuj\u0105cy interfejs <span style=\"font-style: italic;\">ICommand<\/span>, czyli w naszym przypadku jaki\u015b obiekt typu <span style=\"font-style: italic;\">DelegateCommand<\/span>. Robimy to w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre lang=\"csharp\">\r\nDelegateCommand DistributeCommand = new DelegateCommand(DistributeCards);\r\nSomeCompositeCommand.RegisterCommand(DistributeCommand);\r\n<\/pre>\n<p>w razie potrzeby mo\u017cemy usun\u0105\u0107 komend\u0119 z kolekcji komend przy pomocy nast\u0119puj\u0105cej sk\u0142adni:<\/p>\n<pre lang=\"csharp\">\r\nSomeCompositeCommand.UnregisterCommand(DistributeCommand);\r\n<\/pre>\n<p>Maj\u0105c ju\u017c stworzony obiekt typu <span style=\"font-style: italic;\">CompositeCommand<\/span> oraz zarejestrowane w nim obiekty <span style=\"font-style: italic;\">DelegateCommand<\/span> mo\u017cemy zastosowa\u0107 bindowanie.<\/p>\n<pre lang=\"xml\">\r\n<Button Command=\"{Binding SomeCompositeCommand}\" Grid.Column=\"1\">Rodzaj<\/Button>\r\n<\/pre>\n<p>Od teraz, w chwili naci\u015bni\u0119cia przycisku, najpierw sprawdzane jest czy dana <span style=\"font-style: italic;\">CompositeCommand <\/span>mo\u017ce zosta\u0107 wykonana. <span style=\"font-style: italic;\">CompositeCommand <\/span>mo\u017ce zosta\u0107 wykonana tylko wtedy, gdy wszystkie komendy do niej podpi\u0119te mog\u0105 zosta\u0107 wykonane. Je\u017celi warunek ten zostanie spe\u0142niony nast\u0119puje wywo\u0142ywanie po kolei wszystkich metod execute z komend podpi\u0119tych do danej <span style=\"font-style: italic;\">CompositCommand<\/span>. <span style=\"font-style: italic;\">CompositeCommand <\/span> znajduje zastosowanie w przypadku gdy pozwalamy u\u017cytkownikowi na edycj\u0119 wielu element\u00f3w jednocze\u015bnie i potrzebujemy w prosty spos\u00f3b przeprowadzi\u0107 walidacj\u0119 na poszczeg\u00f3lnych widokach.<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/11\/prism-komendy\/CompositeCommand.jpg\" rel=\"attachment wp-att-495\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/11\/prism-komendy\/CompositeCommand.jpg\" alt=\"Komendy\" width=\"560\" class=\"aligncenter size-full wp-image-495\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/11\/prism-komendy\/CompositeCommand.jpg 560w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/11\/prism-komendy\/CompositeCommand-150x79.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2011\/11\/prism-komendy\/CompositeCommand-300x158.jpg 300w\" sizes=\"(max-width: 560px) 100vw, 560px\" \/><\/a><br \/>\n<span style=\"font-style: italic;\">CompositeCommand <\/span>mo\u017ce r\u00f3wnie\u017c wykorzystana np. do zapisania tylko aktywnego widoku. Dzi\u0119ki temu, \u017ce <span style=\"font-style: italic;\">DelegateCommand <\/span>implementuje interfejs <span style=\"font-style: italic;\">IActiveAware<\/span>, <span style=\"font-style: italic;\">CompositeCommand <\/span>wie, kt\u00f3ry widok jest aktualnie zaznaczony i zapisze tylko wybrany widok.<\/p>\n<p>Interfejs <span style=\"font-style: italic;\">IActiveAware<\/span> wygl\u0105da w nast\u0119puj\u0105cy spos\u00f3b<\/p>\n<pre lang=\"csharp\">\r\npublic interface IActiveAware\r\n{    \r\n    bool IsActive { get; set; }\r\n    event EventHandler IsActiveChanged;\r\n}\r\n<\/pre>\n<ul>\n<li><span style=\"font-style: italic;\">bool IsActive<\/span> &#8211; wskazuje czy dana komenda jest aktualnie aktywna<\/li>\n<li>event EventHandler IsActiveChanged &#8211; informuje o zmianie aktywno\u015bci komendy<\/li>\n<\/ul>\n<p>W celu wykorzystania tego interfejsu przez <span style=\"font-style: italic;\">CompositeCommand <\/span>nale\u017cy skorzysta\u0107 z drugiego dost\u0119pnego konstruktora tej klasy<\/p>\n<pre lang=\"csharp\">\r\nCompositeCommand SomeCompositeCommand = new CompositeCommand(true);\r\n<\/pre>\n<p>Od teraz po naci\u015bni\u0119ciu przycisku zbindowanego do tej komendy, wywo\u0142ana zostanie jedynie aktywna komenda &#8211; czyli taka, kt\u00f3rej w\u0142a\u015bciwo\u015b\u0107 <span style=\"font-style: italic;\">IsActive<\/span> zosta\u0142a ustawiona na true. Niestety o ustawianie aktywno\u015bci danej komendy musimy zadba\u0107 sami.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. DelegateCommands DelegateCommands w Prismie s\u0105 to obiekty, kt\u00f3re implementuj\u0105 interfejs ICommand, s\u0142u\u017c\u0105 one do interakcji widoku z ViewModelem. Korzystaj\u0105c z Prisma nie musimy ju\u017c pisa\u0107 w\u0142asnej klasy implementuj\u0105cej ten interfejs (tak jak to zrobili\u015bmy tutaj). Konstruktor klasy DelegateCommand przyjmuje dwa parametry: Action execteMethod &#8211; funkcja odpalania przy wywo\u0142aniu komendy, Func canExecuteMethod &#8211; funkcja sprawdzaj\u0105ca [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[137,138,134,44,45],"tags":[264,265,262,190,191],"class_list":["post-64","post","type-post","status-publish","format-standard","hentry","category-compositecommand","category-delegatecommand","category-prism","category-silverlight","category-wpf","tag-compositecommand","tag-delegatecommand","tag-prism","tag-silverlight","tag-wpf"],"_links":{"self":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/64","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/comments?post=64"}],"version-history":[{"count":5,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/64\/revisions"}],"predecessor-version":[{"id":567,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/64\/revisions\/567"}],"wp:attachment":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/media?parent=64"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/categories?post=64"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/tags?post=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}