diff options
| author | jpbruyere <jp.bruyere@hotmail.com> | 2016-10-18 18:07:49 +0200 |
|---|---|---|
| committer | jpbruyere <jp.bruyere@hotmail.com> | 2016-10-18 18:07:49 +0200 |
| commit | 6921288d39e68e13428ea2b41da45299d2238acd (patch) | |
| tree | f05bdf0777a1c60ecfb38da27cf9746b3d93ef80 /src | |
| parent | 1d86070cfe97510545b0023aba101b9516fbea15 (diff) | |
add DataTest property to TemplatedGroup for testing data members in addition to data type
Diffstat (limited to 'src')
| -rw-r--r-- | src/GraphicObjects/TemplatedGroup.cs | 53 |
1 files 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<SelectionChangeEventArgs> SelectedItemChanged; @@ -56,6 +56,9 @@ namespace Crow //but then i should test if null in msil gen public Dictionary<string, ItemTemplate> ItemTemplates = new Dictionary<string, Crow.ItemTemplate>(); + /// <summary> + /// Default item template + /// </summary> [XmlAttributeAttribute][DefaultValue("#Crow.Templates.ItemTemplate.goml")] public string ItemTemplate { get { return _itemTemplate; } @@ -81,6 +84,24 @@ namespace Crow else NotifyValueChanged ("HasChildren", true); } + /// <summary> + /// 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 + /// </summary> + /// <value>The data property test.</value> + [XmlAttributeAttribute][DefaultValue("TypeOf")] + public string DataTest { + get { return _dataTest; } + set { + if (value == _dataTest) + return; + + _dataTest = value; + + NotifyValueChanged("DataTest", _dataTest); + } + } #endregion public virtual List<GraphicObject> 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); |