Saturday, September 11, 2010

many-to-1 relation -- at heart of wpf commanding

To a beginner (like me) wpf commanding has a many-to-1 entity relationship at its core. This m:1 is highlighted in numerous wpf tutorials.

m:1 means 1 logical "task" mapping to multiple physical "controls". (Note it's Never many-to-many.) Best example is a simple print (or Save or Close) task mapped to a shortcut  key combination, a button, a menu bar item, a context menu item etc.

It may be slightly imprecise to call them "controls", but this terminology is nice and simple. Let's not play language lawyers. Strictly, the shortcut key is actually a KeyGesture instance, and a kind of "command source". Indeed, Command-source is the technical term -- rather abstract.

When you first expand your design from 1:1 to 1:2, adding a 2nd control, you may do a bit of harmless copy-paste. When you expand to 1:m, you need more serious OO modelling and abstraction. The OO abstraction chosen by WPF creators is the commanding infrastructure, an object-oriented solution. (As mentioned in
http://bigblog.tanbin.com/2012/04/gui-swing-etc-needs-more-object.html, GUI systems often feature powerful, elegant design patterns.) The commanding pattern addresses the configuration, and the binding -- the glue-up, the hook-up, the plumbing between source (and target) "controls" on one hand and task execution logic on the other -- the m:1 mapping.

As explained in THE msdn article (http://msdn.microsoft.com/en-us/library/ms752308.aspx), a command binding instance connects 3 kinds of things -- command / source / target. The 1:m is "command 1: many Sources" [1]. The target is slightly less important to a beginner.

[1] a KeyGesture instance is also a command source.

No comments:

Total Pageviews

my favorite topics (labels)

_fuxi (302) _misLabel (13) _orig? (3) _rm (2) _vague (2) clarified (58) cpp (39) cpp_const (22) cpp_real (76) cpp/java/c# (101) cppBig4 (54) cppSmartPtr (35) cppSTL (33) cppSTL_itr (27) cppSTL_real (26) cppTemplate (28) creditMkt (14) db (65) db_sybase (43) deepUnder (31) dotnet (20) ECN (27) econ/bank` (36) fin/sys_misc (43) finGreek (34) finReal (45) finRisk (30) finTechDesign (46) finTechMisc (32) finVol (66) FixedIncom (28) fMath (7) fMathOption (33) fMathStoch (67) forex (39) gr8IV_Q (46) GTD_skill (15) GUI_event (30) inMemDB (42) intuit_math (41) intuitFinance (57) javaMisc (68) javaServerSide (13) lambda/delegate (22) marketData (28) math (10) mathStat (55) memIssue (8) memMgmt (66) metaProgram` (6) OO_Design (84) original_content (749) polymorphic/vptr (40) productive (21) ptr/ref (48) py (28) reflect (8) script`/unix (82) socket/stream (39) subquery/join (30) subvert (13) swing/wpf (9) sysProgram` (16) thread (164) thread_CAS (15) thread_cpp (28) Thread* (22) timeSaver (80) transactional (23) tune (24) tuneDB (40) tuneLatency (30) z_ajax (9) z_algoDataStruct (41) z_arch (26) z_arch_job (27) z_automateTest (17) z_autoTrad` (19) z_bestPractice (39) z_bold (83) z_bondMath (35) z_book (18) z_boost (19) z_byRef^Val (32) z_c#GUI (43) z_c#misc (80) z_cast/convert (28) z_container (67) z_cStr/arr (39) z_Favorite* (8) z_FIX (15) z_forex (48) z_fwd_Deal (18) z_gz=job (33) z_gzBig20 (13) z_gzMgr (13) z_gzPain (20) z_gzThreat (19) z_hib (19) z_IDE (52) z_ikm (5) z_IR_misc (36) z_IRS (26) z_javaWeb (28) z_jdbc (10) z_jobFinTech (46) z_jobHunt (20) z_jobRealXp (10) z_jobStrength (15) z_jobUS^asia (27) z_letter (42) z_linq (10) z_memberHid` (11) z_MOM (54) z_nestedClass (5) z_oq (24) z_PCP (12) z_pearl (1) z_php (20) z_prodSupport (7) z_py (31) z_quant (14) z_regex (8) z_rv (38) z_skillist (48) z_slic`Problem (6) z_SOA (14) z_spring (25) z_src_code (8) z_swingMisc (50) z_swingTable (26) z_unpublish (2) z_VBA/Excel (8) z_windoz (17) z_wpfCommand (9)

About Me

New York (Time Square), NY, United States
http://www.linkedin.com/in/tanbin