diff options
| author | jpbruyere <jp.bruyere@hotmail.com> | 2016-12-21 10:45:51 +0100 |
|---|---|---|
| committer | jpbruyere <jp.bruyere@hotmail.com> | 2016-12-21 10:45:51 +0100 |
| commit | c382841870f704e28b473d73b7fbc9e57a4f678a (patch) | |
| tree | 14f4bd979bee6725936f365d5529deeec68f4de8 /src | |
| parent | 37199aaa7104294355cbc81ecd9088103b7d29be (diff) | |
use class BindingDefinition to store source and target data's
modifié : src/IML/BindingDefinition.cs
modifié : src/IML/Context.cs
modifié : src/Instantiator.cs
Diffstat (limited to 'src')
| -rw-r--r-- | src/IML/BindingDefinition.cs | 14 | ||||
| -rw-r--r-- | src/IML/Context.cs | 5 | ||||
| -rw-r--r-- | src/Instantiator.cs | 58 |
3 files changed, 37 insertions, 40 deletions
diff --git a/src/IML/BindingDefinition.cs b/src/IML/BindingDefinition.cs index dd76f183..e357fcac 100644 --- a/src/IML/BindingDefinition.cs +++ b/src/IML/BindingDefinition.cs @@ -27,14 +27,18 @@ namespace Crow.IML /// </summary> public class BindingDefinition { - public NodeAddress SourceNA; - public string SourceMember; - public NodeAddress TargetNA; - public string TargetMember; - public string TargetName; + public NodeAddress SourceNA = null; + public string SourceMember = ""; + public NodeAddress TargetNA = null; + public string TargetMember = ""; + public string TargetName = ""; public bool TwoWay = false; #region CTOR + public BindingDefinition (NodeAddress _sourceNA, string _sourceMember){ + SourceNA = _sourceNA; + SourceMember = _sourceMember; + } public BindingDefinition (NodeAddress _sourceNA, string _sourceMember, NodeAddress _targetNA, string _targetMember, string _targetName = "", bool _twoWay = false) { SourceNA = _sourceNA; diff --git a/src/IML/Context.cs b/src/IML/Context.cs index 4c664700..09329e1b 100644 --- a/src/IML/Context.cs +++ b/src/IML/Context.cs @@ -85,6 +85,11 @@ namespace Crow.IML nodeBindings [origMember] = new List<MemberAddress> (); nodeBindings [origMember].Add (new MemberAddress (destNA, destMember)); } + public void StorePropertyBinding(BindingDefinition bindDef){ + StorePropertyBinding (bindDef.TargetNA, bindDef.TargetMember, bindDef.SourceNA, bindDef.SourceMember); + if (bindDef.TwoWay) + StorePropertyBinding (bindDef.SourceNA, bindDef.SourceMember, bindDef.TargetNA, bindDef.TargetMember); + } void initILGen () { il.DeclareLocal (typeof (GraphicObject)); diff --git a/src/Instantiator.cs b/src/Instantiator.cs index b7ce8e99..c546e633 100644 --- a/src/Instantiator.cs +++ b/src/Instantiator.cs @@ -416,54 +416,44 @@ namespace Crow /// <param name="targetNA">Target Node Address</param> /// <param name="targetMember">Target member name</param> /// <param name="targetName">Target node name</param> - bool splitBindingExp(NodeAddress sourceNA, string expression, out NodeAddress targetNA, out string targetMember, out string targetName){ - bool twoWay = false; - targetName = ""; + BindingDefinition splitBindingExp(NodeAddress sourceNA, string sourceMember, string expression){ + BindingDefinition bindingDef = new BindingDefinition(sourceNA, sourceMember); if (string.IsNullOrEmpty (expression)) { - targetNA = null; - targetMember = ""; + return bindingDef; } else { if (expression.StartsWith ("²")) { - twoWay = true; + bindingDef.TwoWay = true; expression = expression.Substring (1); } string[] bindingExp = expression.Split ('/'); - if (bindingExp.Length == 1) - targetNA = null;//datasource binding - else - targetNA = getNodeAdressFromBindingExp (sourceNA, bindingExp); + if (bindingExp.Length > 1) + bindingDef.TargetNA = getNodeAdressFromBindingExp (sourceNA, bindingExp); string [] bindTrg = bindingExp.Last().Split ('.'); if (bindTrg.Length == 1) - targetMember = bindTrg [0]; + bindingDef.TargetMember = bindTrg [0]; else if (bindTrg.Length == 2) { //named target - targetName = bindTrg[0]; - targetMember = bindTrg [1]; + bindingDef.TargetName = bindTrg[0]; + bindingDef.TargetMember = bindTrg [1]; } else throw new Exception ("Syntax error in binding, expected 'go dot member'"); } - return twoWay; + return bindingDef; } void readPropertyBinding (Context ctx, string sourceMember, string expression) - { - string targetMember, targetName; - NodeAddress sourceNA = ctx.CurrentNodeAddress, targetNA; - - bool twoWay = splitBindingExp (sourceNA, expression, out targetNA, out targetMember, out targetName); + { + NodeAddress sourceNA = ctx.CurrentNodeAddress; + BindingDefinition bindingDef = splitBindingExp (sourceNA, sourceMember, expression); - if (targetNA == null) {//bind on data source - emitDataSourceBindingDelegate (ctx, sourceMember, targetMember); - return; - } - - ctx.StorePropertyBinding (targetNA, targetMember, sourceNA, sourceMember); -// if (twoWay) -// ctx.StorePropertyBinding (currentNode, sourceMember, targetNA, memberName); + if (bindingDef.TargetNA == null)//bind on data source + emitDataSourceBindingDelegate (ctx, sourceMember, bindingDef.TargetMember); + else + ctx.StorePropertyBinding (bindingDef); } /// <summary> /// Gets the node adress from binding expression splitted with '/' starting at a given node @@ -634,17 +624,15 @@ namespace Crow ctx.emitCachedDelegateHandlerAddition(dmIdx, sourceEvent); } - void emitHandlerBinding (Context ctx, EventInfo sourceEvent, string expression){ - string memberName, namedNode; - NodeAddress currentNode = ctx.CurrentNodeAddress, targetNA; - - splitBindingExp (currentNode, expression, out targetNA, out memberName, out namedNode); + void emitHandlerBinding (Context ctx, EventInfo sourceEvent, string expression){ + NodeAddress currentNode = ctx.CurrentNodeAddress; + BindingDefinition bindingDef = splitBindingExp (currentNode, sourceEvent.Name, expression); string bindOnEventName = null; - if (targetNA == null)//datasource handler + if (bindingDef.TargetNA == null)//datasource handler bindOnEventName = "DataSourceChanged"; - else if (targetNA.Count == 0)//out of tree template handler + else if (bindingDef.TargetNA.Count == 0)//out of tree template handler bindOnEventName = "ParentChanged"; if (!string.IsNullOrEmpty(bindOnEventName)){ @@ -662,7 +650,7 @@ namespace Crow //fetch method in datasource and test if it exist il.Emit (OpCodes.Ldarg_2);//load new datasource il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS); - il.Emit (OpCodes.Ldstr, memberName);//load handler method name + il.Emit (OpCodes.Ldstr, bindingDef.TargetMember);//load handler method name il.Emit (OpCodes.Call, typeof(CompilerServices).GetMethod("getMethodInfoWithReflexion", BindingFlags.Static | BindingFlags.Public)); il.Emit (OpCodes.Stloc_0);//save MethodInfo il.Emit (OpCodes.Ldloc_0);//push mi for test if null |