Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/xwt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLluis Sanchez <lluis@xamarin.com>2014-02-24 18:12:30 +0400
committerLluis Sanchez <lluis@xamarin.com>2014-02-24 18:12:30 +0400
commitfe71a6ff33b733fa9cf15372d28c58d273ecd35d (patch)
tree148692e8842f6a2a370388fcfd6678bfdf1b09bb /Xwt.WPF
parentb3ea01d61cdc57939cc865c8e5e6d9953c13f5dc (diff)
[WPF] Implement new CellView api
Diffstat (limited to 'Xwt.WPF')
-rw-r--r--Xwt.WPF/Xwt.WPF.csproj2
-rw-r--r--Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewBackend.cs119
-rw-r--r--Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewPanel.cs108
-rw-r--r--Xwt.WPF/Xwt.WPFBackend.CellViews/CellViewBackend.cs83
-rw-r--r--Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs35
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/ComboBoxBackend.cs4
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs2
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs21
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs2
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs2
10 files changed, 248 insertions, 130 deletions
diff --git a/Xwt.WPF/Xwt.WPF.csproj b/Xwt.WPF/Xwt.WPF.csproj
index 65ee2694..eba086da 100644
--- a/Xwt.WPF/Xwt.WPF.csproj
+++ b/Xwt.WPF/Xwt.WPF.csproj
@@ -49,6 +49,8 @@
<ItemGroup>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="Xwt.WPFBackend.CellViews\CanvasCellViewBackend.cs" />
+ <Compile Include="Xwt.WPFBackend.CellViews\CanvasCellViewPanel.cs" />
+ <Compile Include="Xwt.WPFBackend.CellViews\CellViewBackend.cs" />
<Compile Include="Xwt.WPFBackend.Interop\NativeStockIcon.cs" />
<Compile Include="Xwt.WPFBackend.Utilities\CellUtil.cs" />
<Compile Include="Xwt.WPFBackend.Utilities\ImageToImageSourceConverter.cs" />
diff --git a/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewBackend.cs
index 536c3f4d..149ff202 100644
--- a/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewBackend.cs
@@ -1,115 +1,16 @@
-//
-// CanvasCellViewBackend.cs
-//
-// Author:
-// David Karlaš <david.karlas@gmail.com>
-//
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-using System;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
using System.Windows;
using Xwt.Backends;
namespace Xwt.WPFBackend
{
- class CanvasCellViewBackend : CustomPanel, ICellDataSource
- {
- public CanvasCellViewBackend()
- {
- DataContextChanged += OnDataChanged;
- }
-
- void OnDataChanged(object sender, DependencyPropertyChangedEventArgs e)
- {
- if (e.OldValue != null && e.OldValue is ValuesContainer)
- ((ValuesContainer)e.OldValue).PropertyChanged -= CanvasCellRenderer_PropertyChanged;
-
- if (e.NewValue is ValuesContainer)
- {
- ((ValuesContainer)DataContext).PropertyChanged += CanvasCellRenderer_PropertyChanged;
- }
- }
-
- void CanvasCellRenderer_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
- {
- InvalidateMeasure();
- InvalidateVisual();
- }
-
- public event DependencyPropertyChangedEventHandler CellViewChanged;
-
- public static readonly DependencyProperty CellViewProperty =
- DependencyProperty.Register("CellView", typeof(CanvasCellView),
- typeof(CanvasCellViewBackend), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCellViewChanged)));
-
- public ICanvasCellViewFrontend CellView
- {
- get { return (ICanvasCellViewFrontend)GetValue (CellViewProperty); }
- set { SetValue(CellViewProperty, value); }
- }
-
- public static void OnCellViewChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
- {
- var sl = sender as CanvasCellViewBackend;
- if (sl != null)
- sl.RaiseCellViewChangedEvent(e);
- }
-
- private void RaiseCellViewChangedEvent(DependencyPropertyChangedEventArgs e)
- {
- if (this.CellViewChanged != null)
- this.CellViewChanged(this, e);
- }
-
- protected override void OnRender(System.Windows.Media.DrawingContext dc)
- {
- base.OnRender(dc);
- CellView.Initialize(this);
- CellView.ApplicationContext.InvokeUserCode (delegate
- {
- DrawingContext ctx = new DrawingContext(dc, 1);
- CellView.Draw (ctx, new Rectangle (this.RenderTransform.Value.OffsetX, this.RenderTransform.Value.OffsetY, this.RenderSize.Width, this.RenderSize.Height));
- });
- }
-
- protected override System.Windows.Size MeasureOverride(System.Windows.Size constraint)
- {
- var size = new System.Windows.Size();
- CellView.Initialize (this);
- CellView.ApplicationContext.InvokeUserCode (delegate
- {
- var s = CellView.GetRequiredSize ();
- size = new System.Windows.Size(s.Width, s.Height);
- });
- if (size.Width > constraint.Width)
- size.Width = constraint.Width;
- if (size.Height > constraint.Height)
- size.Height = constraint.Height;
- return size;
- }
-
- public object GetValue(IDataField field)
- {
- if (DataContext == null)
- return null;
- return ((ValuesContainer)DataContext)[field.Index];
- }
- }
+ class CanvasCellViewBackend: CellViewBackend, ICanvasCellViewBackend
+ {
+ public void QueueDraw()
+ {
+ }
+ }
}
-
diff --git a/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewPanel.cs b/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewPanel.cs
new file mode 100644
index 00000000..cdbe7904
--- /dev/null
+++ b/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewPanel.cs
@@ -0,0 +1,108 @@
+//
+// CanvasCellViewBackend.cs
+//
+// Author:
+// David Karlaš <david.karlas@gmail.com>
+//
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Windows;
+using Xwt.Backends;
+
+namespace Xwt.WPFBackend
+{
+ class CanvasCellViewPanel : CustomPanel
+ {
+ public CanvasCellViewPanel()
+ {
+ DataContextChanged += OnDataChanged;
+ }
+
+ void OnDataChanged(object sender, DependencyPropertyChangedEventArgs e)
+ {
+ if (e.OldValue != null && e.OldValue is ValuesContainer)
+ ((ValuesContainer)e.OldValue).PropertyChanged -= CanvasCellRenderer_PropertyChanged;
+
+ if (e.NewValue is ValuesContainer)
+ {
+ ((ValuesContainer)DataContext).PropertyChanged += CanvasCellRenderer_PropertyChanged;
+ }
+ }
+
+ void CanvasCellRenderer_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+ {
+ InvalidateMeasure();
+ InvalidateVisual();
+ }
+
+ public event DependencyPropertyChangedEventHandler CellViewChanged;
+
+ public static readonly DependencyProperty CellViewBackendProperty =
+ DependencyProperty.Register("CellViewBackend", typeof(CellViewBackend),
+ typeof(CanvasCellViewPanel), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCellViewChanged)));
+
+ public CellViewBackend CellViewBackend
+ {
+ get { return (CellViewBackend)GetValue(CellViewBackendProperty); }
+ set { SetValue(CellViewBackendProperty, value); }
+ }
+
+ public static void OnCellViewChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
+ {
+ var sl = sender as CanvasCellViewPanel;
+ if (sl != null)
+ sl.RaiseCellViewChangedEvent(e);
+ }
+
+ private void RaiseCellViewChangedEvent(DependencyPropertyChangedEventArgs e)
+ {
+ if (this.CellViewChanged != null)
+ this.CellViewChanged(this, e);
+ }
+
+ protected override void OnRender(System.Windows.Media.DrawingContext dc)
+ {
+ base.OnRender(dc);
+ CellViewBackend.Load (this);
+ CellViewBackend.ApplicationContext.InvokeUserCode(delegate
+ {
+ DrawingContext ctx = new DrawingContext(dc, 1);
+ ((ICanvasCellViewFrontend)CellViewBackend.CellView).Draw(ctx, new Rectangle(this.RenderTransform.Value.OffsetX, this.RenderTransform.Value.OffsetY, this.RenderSize.Width, this.RenderSize.Height));
+ });
+ }
+
+ protected override System.Windows.Size MeasureOverride(System.Windows.Size constraint)
+ {
+ var size = new System.Windows.Size();
+ CellViewBackend.Load(this);
+ CellViewBackend.ApplicationContext.InvokeUserCode(delegate
+ {
+ var s = ((ICanvasCellViewFrontend)CellViewBackend.CellView).GetRequiredSize();
+ size = new System.Windows.Size(s.Width, s.Height);
+ });
+ if (size.Width > constraint.Width)
+ size.Width = constraint.Width;
+ if (size.Height > constraint.Height)
+ size.Height = constraint.Height;
+ return size;
+ }
+ }
+}
+
diff --git a/Xwt.WPF/Xwt.WPFBackend.CellViews/CellViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend.CellViews/CellViewBackend.cs
new file mode 100644
index 00000000..2d37b501
--- /dev/null
+++ b/Xwt.WPF/Xwt.WPFBackend.CellViews/CellViewBackend.cs
@@ -0,0 +1,83 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using Xwt.Backends;
+
+namespace Xwt.WPFBackend
+{
+ class CellViewBackend : ICellViewBackend, ICellDataSource
+ {
+ FrameworkElement currentElement;
+
+ public CellViewBackend()
+ {
+ }
+
+ public void Initialize(CellView cellView, FrameworkElementFactory factory)
+ {
+ CellView = cellView;
+ }
+
+ public void Load (FrameworkElement elem)
+ {
+ currentElement = elem;
+ CellFrontend.Load(this);
+ }
+
+ public CellView CellView { get; set; }
+
+ public ApplicationContext ApplicationContext { get; set; }
+
+ public ICellViewFrontend CellFrontend
+ {
+ get { return CellView; }
+ }
+
+ public Rectangle CellBounds
+ {
+ get {
+ return new Rectangle(0, 0, currentElement.ActualWidth, currentElement.ActualHeight);
+ }
+ }
+
+ public Rectangle BackgroundBounds
+ {
+ get
+ {
+ return new Rectangle(0, 0, currentElement.ActualWidth, currentElement.ActualHeight);
+ }
+ }
+
+ public bool Selected
+ {
+ get { return false; }
+ }
+
+ public bool HasFocus
+ {
+ get { return false; }
+ }
+
+ public void InitializeBackend(object frontend, ApplicationContext context)
+ {
+ ApplicationContext = context;
+ }
+
+ public void EnableEvent(object eventId)
+ {
+ }
+
+ public void DisableEvent(object eventId)
+ {
+ }
+
+ public object GetValue(IDataField field)
+ {
+ if (currentElement.DataContext == null)
+ return null;
+ return ((ValuesContainer)currentElement.DataContext)[field.Index];
+ }
+ }
+}
diff --git a/Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs b/Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs
index ffee6747..6fcb40df 100644
--- a/Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs
+++ b/Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs
@@ -28,6 +28,7 @@ using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
+using Xwt.Backends;
using SWC = System.Windows.Controls;
using SWM = System.Windows.Media;
@@ -35,24 +36,25 @@ namespace Xwt.WPFBackend.Utilities
{
public static class CellUtil
{
- internal static FrameworkElementFactory CreateBoundColumnTemplate (CellViewCollection views, string dataPath = ".")
+ internal static FrameworkElementFactory CreateBoundColumnTemplate (Widget parent, CellViewCollection views, string dataPath = ".")
{
if (views.Count == 1)
- return CreateBoundCellRenderer (views [0], dataPath);
+ return CreateBoundCellRenderer(parent, views[0], dataPath);
FrameworkElementFactory container = new FrameworkElementFactory (typeof (StackPanel));
- container.SetValue (StackPanel.OrientationProperty, Orientation.Horizontal);
+ container.SetValue (StackPanel.OrientationProperty, System.Windows.Controls.Orientation.Horizontal);
foreach (CellView view in views) {
- container.AppendChild (CreateBoundCellRenderer (view, dataPath));
+ container.AppendChild(CreateBoundCellRenderer(parent, view, dataPath));
}
return container;
}
private static readonly Thickness CellMargins = new Thickness (2);
- internal static FrameworkElementFactory CreateBoundCellRenderer (CellView view, string dataPath = ".")
+ internal static FrameworkElementFactory CreateBoundCellRenderer (Widget parent, CellView view, string dataPath = ".")
{
+ ICellViewFrontend fr = view;
TextCellView textView = view as TextCellView;
if (textView != null) {
// if it's an editable textcontrol, use a TextBox, if not use a TextBlock. Reason for this is that
@@ -91,6 +93,9 @@ namespace Xwt.WPFBackend.Utilities
}
}
+ var cb = new CellViewBackend();
+ cb.Initialize(view, factory);
+ fr.AttachBackend(parent, cb);
return factory;
}
@@ -106,18 +111,23 @@ namespace Xwt.WPFBackend.Utilities
factory.SetBinding (ImageBox.ImageSourceProperty, binding);
}
- return factory;
+ var cb = new CellViewBackend();
+ cb.Initialize(view, factory);
+ fr.AttachBackend(parent, cb);
+ return factory;
}
CanvasCellView canvasView = view as CanvasCellView;
if (canvasView != null)
{
- FrameworkElementFactory factory = new FrameworkElementFactory(typeof(CanvasCellViewBackend));
+ var cb = new CanvasCellViewBackend();
+ FrameworkElementFactory factory = new FrameworkElementFactory(typeof(CanvasCellViewPanel));
factory.SetValue(FrameworkElement.MarginProperty, CellMargins);
+ factory.SetValue(CanvasCellViewPanel.CellViewBackendProperty, cb);
- factory.SetValue(CanvasCellViewBackend.CellViewProperty, view);
-
- return factory;
+ cb.Initialize(view, factory);
+ fr.AttachBackend(parent, cb);
+ return factory;
}
CheckBoxCellView cellView = view as CheckBoxCellView;
@@ -140,7 +150,10 @@ namespace Xwt.WPFBackend.Utilities
factory.SetBinding(SWC.CheckBox.IsCheckedProperty, new Binding(dataPath + "[" + cellView.ActiveField.Index + "]"));
}
- return factory;
+ var cb = new CellViewBackend();
+ cb.Initialize(view, factory);
+ fr.AttachBackend(parent, cb);
+ return factory;
}
throw new NotImplementedException ();
diff --git a/Xwt.WPF/Xwt.WPFBackend/ComboBoxBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ComboBoxBackend.cs
index 0921c8f7..9b0e6c90 100644
--- a/Xwt.WPF/Xwt.WPFBackend/ComboBoxBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend/ComboBoxBackend.cs
@@ -144,12 +144,12 @@ namespace Xwt.WPFBackend
spFactory.SetValue (StackPanel.OrientationProperty, WindowsOrientation.Horizontal);
foreach (var view in views) {
- spFactory.AppendChild (CellUtil.CreateBoundCellRenderer (view));
+ spFactory.AppendChild(CellUtil.CreateBoundCellRenderer(Frontend, view));
}
root = spFactory;
} else {
- root = CellUtil.CreateBoundCellRenderer (views [0]);
+ root = CellUtil.CreateBoundCellRenderer(Frontend, views[0]);
}
template.VisualTree = root;
diff --git a/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs
index 39135966..f02647d6 100644
--- a/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs
@@ -77,7 +77,7 @@ namespace Xwt.WPFBackend
public void SetViews (CellViewCollection views)
{
ListBox.DisplayMemberPath = null;
- ListBox.ItemTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate (views) };
+ ListBox.ItemTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate(Frontend, views) };
}
public void SetSource (IListDataSource source, IBackend sourceBackend)
diff --git a/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs
index 9a4b3973..ef7dbd41 100644
--- a/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs
@@ -116,9 +116,9 @@ namespace Xwt.WPFBackend
public object AddColumn (ListViewColumn col)
{
var column = new GridViewColumn ();
- column.CellTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate (col.Views) };
+ column.CellTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate (Frontend, col.Views) };
if (col.HeaderView != null)
- column.HeaderTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundCellRenderer (col.HeaderView) };
+ column.HeaderTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundCellRenderer (Frontend, col.HeaderView) };
else
column.Header = col.Title;
@@ -135,9 +135,9 @@ namespace Xwt.WPFBackend
public void UpdateColumn (ListViewColumn col, object handle, ListViewColumnChange change)
{
var column = (GridViewColumn) handle;
- column.CellTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate (col.Views) };
+ column.CellTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate(Frontend, col.Views) };
if (col.HeaderView != null)
- column.HeaderTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundCellRenderer (col.HeaderView) };
+ column.HeaderTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundCellRenderer(Frontend, col.HeaderView) };
else
column.Header = col.Title;
}
@@ -234,5 +234,16 @@ namespace Xwt.WPFBackend
}
private static readonly Setter HideHeadersSetter = new Setter (UIElement.VisibilityProperty, Visibility.Collapsed);
- }
+
+
+ public int GetRowAtPosition(Point p)
+ {
+ throw new NotImplementedException();
+ }
+
+ public Rectangle GetCellBounds(int row, CellView cell, bool includeMargin)
+ {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs
index 12a7ae5a..b337a796 100644
--- a/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs
@@ -61,7 +61,7 @@ namespace Xwt.WPFBackend
public void Initialize(IScrollAdjustmentEventSink eventSink)
{
- eventSink = eventSink;
+ this.eventSink = eventSink;
}
public void Initialize (IScrollControlEventSink eventSink)
diff --git a/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs
index b8a56c08..c1f4aff6 100644
--- a/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs
@@ -205,7 +205,7 @@ namespace Xwt.WPFBackend
break;
case ListViewColumnChange.Cells:
- var cellTemplate = CellUtil.CreateBoundColumnTemplate (column.Views);
+ var cellTemplate = CellUtil.CreateBoundColumnTemplate(Frontend, column.Views);
col.CellTemplate = new DataTemplate { VisualTree = cellTemplate };