public ShapeAlterationBuilder BoundAs(string bindingSource, Func <ShapeDescriptor, Func <DisplayContext, IHtmlString> > binder) { // schedule the configuration return(Configure(descriptor => { Func <DisplayContext, IHtmlString> target = null; var binding = new ShapeBinding { ShapeDescriptor = descriptor, BindingName = _bindingName, BindingSource = bindingSource, Binding = displayContext => { // when used, first realize the actual target once if (target == null) { target = binder(descriptor); } // and execute the re return target(displayContext); } }; // ShapeDescriptor.Bindings is a case insensitive dictionary descriptor.Bindings[_bindingName] = binding; })); }
public ShapeAlterationBuilder BoundAs(string bindingSource, Func<ShapeDescriptor, Func<DisplayContext, IHtmlString>> binder) { // schedule the configuration return Configure(descriptor => { Func<DisplayContext, IHtmlString> target = null; var binding = new ShapeBinding { ShapeDescriptor = descriptor, BindingName = _bindingName, BindingSource = bindingSource, Binding = displayContext => { // when used, first realize the actual target once if (target == null) target = binder(descriptor); // and execute the re return target(displayContext); } }; // ShapeDescriptor.Bindings is a case insensitive dictionary descriptor.Bindings[_bindingName] = binding; }); }
static bool TryGetDescriptorBinding(string shapeType, IEnumerable<string> shapeAlternates, ShapeTable shapeTable, out ShapeBinding shapeBinding) { // shape alternates are optional, fully qualified binding names // the earliest added alternates have the lowest priority // the descriptor returned is based on the binding that is matched, so it may be an entirely // different descriptor if the alternate has a different base name foreach (var shapeAlternate in shapeAlternates.Reverse()) { if (shapeTable.Bindings.TryGetValue(shapeAlternate, out shapeBinding)) { return true; } } // when no alternates match, the shapeType is used to find the longest matching binding // the shapetype name can break itself into shorter fallbacks at double-underscore marks // so the shapetype itself may contain a longer alternate forms that falls back to a shorter one var shapeTypeScan = shapeType; for (; ; ) { if (shapeTable.Bindings.TryGetValue(shapeTypeScan, out shapeBinding)) { return true; } var delimiterIndex = shapeTypeScan.LastIndexOf("__"); if (delimiterIndex < 0) { shapeBinding = null; return false; } shapeTypeScan = shapeTypeScan.Substring(0, delimiterIndex); } }
static IHtmlString Process(ShapeBinding shapeBinding, IShape shape, DisplayContext context) { if (shapeBinding == null || shapeBinding.Binding == null) { // todo: create result from all child shapes return shape.Metadata.ChildContent ?? new HtmlString(""); } return CoerceHtmlString(shapeBinding.Binding(context)); }