From bf4348e6eed117757cd8ba13f4ccbe4edc4ebf73 Mon Sep 17 00:00:00 2001 From: jpbruyere Date: Tue, 18 Oct 2016 18:07:49 +0200 Subject: [PATCH] add DataTest property to TemplatedGroup for testing data members in addition to data type --- src/GraphicObjects/TemplatedGroup.cs | 53 ++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/src/GraphicObjects/TemplatedGroup.cs b/src/GraphicObjects/TemplatedGroup.cs index 500e5ea6..7fb3ceff 100644 --- a/src/GraphicObjects/TemplatedGroup.cs +++ b/src/GraphicObjects/TemplatedGroup.cs @@ -36,7 +36,7 @@ namespace Crow #endregion protected Group items; - string _itemTemplate; + string _itemTemplate, _dataTest; #region events public event EventHandler SelectedItemChanged; @@ -56,6 +56,9 @@ namespace Crow //but then i should test if null in msil gen public Dictionary ItemTemplates = new Dictionary(); + /// + /// Default item template + /// [XmlAttributeAttribute][DefaultValue("#Crow.Templates.ItemTemplate.goml")] public string ItemTemplate { get { return _itemTemplate; } @@ -81,6 +84,24 @@ namespace Crow else NotifyValueChanged ("HasChildren", true); } + /// + /// Use to define condition on Data item for selecting among ItemTemplates. + /// Default value is 'TypeOf' for selecting Template depending on Type of Data. + /// Other possible values are properties of Data + /// + /// The data property test. + [XmlAttributeAttribute][DefaultValue("TypeOf")] + public string DataTest { + get { return _dataTest; } + set { + if (value == _dataTest) + return; + + _dataTest = value; + + NotifyValueChanged("DataTest", _dataTest); + } + } #endregion public virtual List Items{ get { return items.Children; }} @@ -113,7 +134,7 @@ namespace Crow NotifyValueChanged ("Data", data); - lock (CurrentInterface.UpdateMutex) + //lock (CurrentInterface.UpdateMutex) ClearItems (); if (data == null) @@ -303,17 +324,6 @@ namespace Crow page.Name = "page" + pageNum; -// //reset size to fit in the dir of the stacking -// //because items total size is forced to approx size -// if (_gsList.Orientation == Orientation.Horizontal) { -// page.Width = Measure.Fit; - page.BindMember ("Height", "../HeightPolicy"); - page.BindMember ("Width", "../WidthPolicy"); -// } else { -// page.Height = Measure.Fit; -// page.BindMember ("Width", "../WidthPolicy"); -// } - for (int i = (pageNum - 1) * itemPerPage; i < pageNum * itemPerPage; i++) { if (i >= data.Count) break; @@ -335,13 +345,24 @@ namespace Crow loadingTime.ElapsedMilliseconds, this.ToString()); #endif } + string getItempKey(Type dataType, object o){ + try { + return dataType.GetProperty (_dataTest).GetGetMethod ().Invoke (o, null).ToString(); + } catch (Exception ex) { + return dataType.FullName; + } + } protected void loadItem(int i, Group page){ GraphicObject g = null; ItemTemplate iTemp = null; Type dataType = data [i].GetType (); + string itempKey = dataType.FullName; + + if (_dataTest != "TypeOf") + itempKey = getItempKey (dataType, data [i]); - if (ItemTemplates.ContainsKey (dataType.FullName)) - iTemp = ItemTemplates [dataType.FullName]; + if (ItemTemplates.ContainsKey (itempKey)) + iTemp = ItemTemplates [itempKey]; else iTemp = ItemTemplates ["default"]; @@ -349,6 +370,8 @@ namespace Crow g = iTemp.CreateInstance(CurrentInterface); page.AddChild (g); g.DataSource = data [i]; + if (typeof(IBindable).IsAssignableFrom (dataType)) + CompilerServices.ResolveBindings ((data [i] as IBindable).Bindings); } registerItemClick (g); -- 2.47.3