This question is locked. New answers and comments are not allowed.
Using this to represent rows of data...
using System;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using System.Collections;using System.Collections.Generic;using System.Dynamic;using System.ComponentModel;using LyndWorld.LiveWire.SilverlightUI.Web.Models;namespace LyndWorld.LiveWire.SilverlightUI.Entities{ public class LiveWireDataRow : DynamicObject, INotifyPropertyChanged { readonly IDictionary<string, object> _data; public LiveWireDataRow() { _data = new Dictionary<string, object>(); } public LiveWireDataRow(IDictionary<string, object> source) { _data = source; } public override IEnumerable<string> GetDynamicMemberNames() { return _data.Keys; } public override bool TryGetMember(GetMemberBinder binder, out object result) { result = this[binder.Name]; return true; } public override bool TrySetMember(SetMemberBinder binder, object value) { this[binder.Name] = value; return true; } public object this[string columnName] { get { if (_data.ContainsKey(columnName)) { return _data[columnName]; } return null; } set { if (!_data.ContainsKey(columnName)) { _data.Add(columnName, value); OnPropertyChanged(columnName); } else { if (_data[columnName] != value) { _data[columnName] = value; OnPropertyChanged(columnName); } } } } public void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public event PropertyChangedEventHandler PropertyChanged; }}
and using this to represent cells of data...
namespace LyndWorld.LiveWire.SilverlightUI.Entities
{
public class LiveWireDataCell
{
private object _value;
private string _referenceUrl;
public LiveWireDataCell(object pValue)
{
_value = pValue;
}
public LiveWireDataCell(object pValue, string pReferenceUrl)
{
_value = pValue;
_referenceUrl = pReferenceUrl;
}
public object Value { get; set; }
public string ReferenceUrl { get; set; }
}
}
The grid doesnt know to call the Value property of the LiveWireDataCell object to get its display value. See the code below for how I am building and binding.
using System.Globalization;
using System.Threading.Tasks;
namespace LyndWorld.LiveWire.SilverlightUI
{
using System;
using System.Windows;
using System.Windows.Controls;
using System.ServiceModel.DomainServices.Client;
using System.Windows.Data;
using Web.Services;
using Web.Models;
using Entities;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Linq;
using Helpers;
using Telerik.Windows.Controls.GridView;
using Telerik.Windows.Controls;
using Telerik.Windows.Data;
/// <summary>
/// <see cref="UserControl"/> class providing the main UI for the application.
/// </summary>
public partial class MainPage
{
private const string UserName = "skennett";
private LiveWireContext _context;
private LoadOperation<LiveWireDataColumn> _dataColumnOperation;
private LiveWireUser _user;
private LoadOperation<GetLiveWireViewsByUserId_Result> _userViewsOperation;
private LoadOperation<GetLiveWireDataSetsByUserId_Result> _userDataSetsOperation;
private LoadOperation<GetDataPoints_Result> _dataPointsOperation;
/// <summary>
/// Creates a new <see cref="MainPage"/> instance.
/// </summary>
public MainPage()
{
InitializeComponent();
Loaded += MainPageLoaded;
SizeChanged += MainPageSizeChanged;
}
void MainPageSizeChanged(object sender, SizeChangedEventArgs e)
{
if (!Application.Current.Host.Content.IsFullScreen)
{
gvLiveWire.MaxHeight = 280;
gvLiveWire.ScrollMode = ScrollUpdateMode.RealTime;
}
else
{
gvLiveWire.MaxHeight = (e.NewSize.Height - 100);
gvLiveWire.ScrollMode = ScrollUpdateMode.Deferred;
}
}
private async void InitializeLiveWire()
{
LiveWireBusyIndicator.IsBusy = true;
await HandleAsyncCalls();
InitializeUserViews();
InitializeUserDataSets();
InitializeDataColumns();
await InitializeDataPoints();
LiveWireBusyIndicator.IsBusy = false;
}
private async Task<int> HandleAsyncCalls()
{
var userIdOperation = await _context.Load(
_context.GetUserIdByUsernameQuery(UserName)
).AsTask();
if (!userIdOperation.Entities.Any())
{
throw new Exception("User ID not found.");
}
var userId = userIdOperation.Entities.First().Id;
var userOperation = await _context.Load(
_context.GetLiveWireUserByIdQuery(userId)
).AsTask();
_user = userOperation.Entities.First();
_userViewsOperation = await _context.Load(
_context.GetLiveWireViewsByUserIdQuery(_user.Id)
).AsTask();
_userDataSetsOperation = await _context.Load(
_context.GetLiveWireDataSetsByUserIdQuery(_user.Id,
_user.UserRoleMappings.First().LiveWireRoleId)
).AsTask();
_dataColumnOperation = await _context.Load(
_context.GetDataColumnsQuery(_user.DefaultDataSet)
).AsTask();
_dataPointsOperation = await _context.Load(
_context.GetDataPointsQuery(_user.Id,
_user.UserRoleMappings.First().LiveWireRoleId,
_user.DefaultDataSet, _user.DefaultView, true)
).AsTask();
return 0;
}
private void InitializeUserViews()
{
var root = new ObservableCollection<ViewMenuItem>();
var subItems = new ObservableCollection<ViewMenuItem>();
var views = new ViewMenuItem(0) { Text = "Views" };
foreach (var item in
from result in _userViewsOperation.Entities
where result.ParentId == null
let id = result.Id
where id != null
select new ViewMenuItem(id.Value) { Text = result.Name })
{
item.SubItems = GetChildren(item, _userViewsOperation.Entities);
subItems.Add(item);
}
views.SubItems = subItems;
root.Add(views);
mnuViews.ItemsSource = root;
mnuViews.ItemClick += MnuViewsItemClick;
}
private void InitializeUserDataSets()
{
var dataSets = new ObservableCollection<DataSetMenuItem>();
var dataSetsSubItems = new ObservableCollection<DataSetMenuItem>();
var dataSetsItem = new DataSetMenuItem(Guid.NewGuid()) { Text = "Data Sets" };
foreach (
var item in _userDataSetsOperation.Entities.Select(
result => new DataSetMenuItem(result.Id) { Text = result.Name })
)
{
dataSetsSubItems.Add(item);
}
dataSetsItem.SubItems = dataSetsSubItems;
dataSets.Add(dataSetsItem);
mnuDataSet.ItemsSource = dataSets;
}
private void InitializeDataColumns()
{
var idCol = new GridViewDataColumn
{
Header = "Id",
DisplayIndex = 0,
DataMemberBinding = new Binding("Id"),
DataType = typeof(String),
UniqueName = "Id"
};
gvLiveWire.Columns.Add(idCol);
foreach (var column in _dataColumnOperation.Entities)
{
var gvdc = new GridViewDataColumn
{
Header = column.Name,
DisplayIndex = column.Ordinal,
UniqueName = column.Name.Replace(" ", String.Empty)
};
gvdc.DataMemberBinding = new Binding(gvdc.UniqueName);
gvdc.TextAlignment = TextAlignment.Right;
gvdc.FooterTextAlignment = TextAlignment.Right;
switch (column.DisplayDataTypeId)
{
case (int)DisplayDataType.Currency:
gvdc.DataType = typeof(Decimal);
gvdc.DataFormatString = "{0:C}";
switch (column.LiveWireDataColumnFooterFormula.Id)
{
case (int)Entities.LiveWireDataColumnFooterFormula.Sum:
gvdc.AggregateFunctions.Add(new AggregateFunction<LiveWireDataRow, Decimal>
{
AggregationExpression =
total => total.Sum(row => Convert.ToDecimal(row[gvdc.UniqueName])),
ResultFormatString = gvdc.DataFormatString
}
);
break;
case (int)Entities.LiveWireDataColumnFooterFormula.Average:
gvdc.AggregateFunctions.Add(
new AggregateFunction<LiveWireDataRow, Decimal>
{
AggregationExpression =
total => total.Average(row => Convert.ToDecimal(row[gvdc.UniqueName])),
ResultFormatString = gvdc.DataFormatString
}
);
break;
}
break;
case (int)DisplayDataType.Date:
gvdc.DataType = typeof(DateTime);
gvdc.DataFormatString = "{0:d}";
gvdc.TextAlignment = TextAlignment.Left;
break;
case (int)DisplayDataType.Number:
gvdc.DataType = typeof(Int32);
gvdc.DataFormatString = "{0:N0}";
switch (column.LiveWireDataColumnFooterFormula.Id)
{
case (int)Entities.LiveWireDataColumnFooterFormula.Sum:
gvdc.AggregateFunctions.Add(
new AggregateFunction<LiveWireDataRow, Int32>
{
AggregationExpression =
total => total.Sum(row => Convert.ToInt32(row[gvdc.UniqueName])),
ResultFormatString = gvdc.DataFormatString
}
);
break;
case (int)Entities.LiveWireDataColumnFooterFormula.Average:
gvdc.AggregateFunctions.Add(
new AggregateFunction<LiveWireDataRow, Double>
{
AggregationExpression =
total => total.Average(row => Convert.ToInt32(row[gvdc.UniqueName])),
ResultFormatString = gvdc.DataFormatString
}
);
break;
}
break;
case (int)DisplayDataType.Percentage:
gvdc.DataType = typeof(Decimal);
gvdc.DataFormatString = "{0:P}";
switch (column.LiveWireDataColumnFooterFormula.Id)
{
case (int)Entities.LiveWireDataColumnFooterFormula.Sum:
gvdc.AggregateFunctions.Add(
new AggregateFunction<LiveWireDataRow, Decimal>
{
AggregationExpression =
total => total.Sum(row => Convert.ToDecimal(row[gvdc.UniqueName])),
ResultFormatString = gvdc.DataFormatString
}
);
break;
case (int)Entities.LiveWireDataColumnFooterFormula.Average:
gvdc.AggregateFunctions.Add(
new AggregateFunction<LiveWireDataRow, Decimal>
{
AggregationExpression =
total => total.Average(row => Convert.ToDecimal(row[gvdc.UniqueName])),
ResultFormatString = gvdc.DataFormatString,
}
);
break;
}
break;
default:
gvdc.DataType = typeof(String);
gvdc.TextAlignment = TextAlignment.Left;
break;
}
gvLiveWire.Columns.Add(gvdc);
}
}
private async Task<int> InitializeDataPoints()
{
var data = new List<LiveWireDataRow>();
var distinctPropertyIds = _dataPointsOperation.Entities.Select(
e => e.PropertyId).Distinct();
foreach (var propertyId in distinctPropertyIds)
{
var row = new LiveWireDataRow();
row["Id"] = propertyId;
foreach (var column in _dataColumnOperation.Entities)
{
string value = null;
string referenceUrl = null;
var uniqueName = column.Name.Replace(" ", string.Empty);
if (!string.IsNullOrEmpty(column.CustomProcedureName))
{
var columnValue = await _context.ExecuteCustomProcedure(
column.CustomProcedureName, propertyId).AsTask();
value = columnValue.Value;
}
else
{
var column1 = column;
var id = propertyId;
var col = from e in _dataPointsOperation.Entities
where e.LiveWireDataColumnId == column1.Id
&& e.PropertyId == id
select e;
var getDataPointsResults
= col as GetDataPoints_Result[] ?? col.ToArray();
if (getDataPointsResults.Any())
{
value = getDataPointsResults.First().Value;
if (!string.IsNullOrEmpty(
getDataPointsResults.First().ReferenceUrl))
{
referenceUrl = getDataPointsResults.First().ReferenceUrl;
}
}
}
var cell = new LiveWireDataCell(value);
if (!string.IsNullOrEmpty(referenceUrl))
{
cell.ReferenceUrl = referenceUrl;
}
switch (column.DisplayDataTypeId)
{
case (int) DisplayDataType.Currency:
cell.Value = Convert.ToDecimal(cell.Value);
row[uniqueName] = cell;
break;
case (int) DisplayDataType.Date:
cell.Value = Convert.ToDateTime(cell.Value);
row[uniqueName] = cell;
break;
case (int) DisplayDataType.Number:
cell.Value = Convert.ToInt32(cell.Value);
row[uniqueName] = cell;
break;
case (int) DisplayDataType.Percentage:
cell.Value = Convert.ToDecimal(cell.Value);
row[uniqueName] = cell;
break;
case (int) DisplayDataType.Text:
row[uniqueName] = cell;
break;
}
}
data.Add(row);
}
gvLiveWire.RowLoaded += GvLiveWireRowLoaded;
gvLiveWire.ItemsSource = data;
return 0;
}
void GvLiveWireRowLoaded(object sender, RowLoadedEventArgs e)
{
return;
var row = e.Row as GridViewRow;
foreach (var column in _dataColumnOperation.Entities)
{
foreach (var code in column.ColorCodes.OrderBy(o => o.Ordinal))
{
List<GridViewCell> cells;
try
{
cells = row.ChildrenOfType<GridViewCell>()
.Where(n => n.Column.UniqueName
== column.Name.ToString(CultureInfo.InvariantCulture)
.Replace(" ", String.Empty))
.ToList();
}
catch (Exception)
{
return;
}
foreach (var cell in cells)
{
switch (column.DisplayDataTypeId)
{
case (int)DisplayDataType.Percentage:
var cellValue = Convert.ToDecimal(cell.Value.ToString()
.Replace("%", String.Empty));
cellValue = cellValue / 100;
var codeValue = Convert.ToDecimal(code.Value);
switch (code.ColorCodeOperatorId)
{
case (int)ColorCodeOperator.IsGreaterThanOrEqualTo:
if (cellValue >= codeValue)
{
cell.Background = ColorUtility.GetBrushFromHex(code.Color);
}
break;
case (int)ColorCodeOperator.IsLessThanOrEqualTo:
if (cellValue <= codeValue)
{
cell.Background = ColorUtility.GetBrushFromHex(code.Color);
}
break;
}
break;
}
}
}
}
}
void MainPageLoaded(object sender, RoutedEventArgs e)
{
_context = new LiveWireContext();
InitializeLiveWire();
btnLyndWorldMap.Click += BtnLyndWorldMapClick;
}
static void BtnLyndWorldMapClick(object sender, RoutedEventArgs e)
{
var window = new Views.LyndWorldMap();
window.Show();
}
private static ObservableCollection<ViewMenuItem> GetChildren(ViewMenuItem pParent, IEnumerable<GetLiveWireViewsByUserId_Result> results)
{
var menuItems = new ObservableCollection<ViewMenuItem>();
var getLiveWireViewsByUserIdResults = results as GetLiveWireViewsByUserId_Result[] ?? results.ToArray();
var query = getLiveWireViewsByUserIdResults.Where(e => e.ParentId == pParent.Id);
foreach (var item in
from result in query
let id = result.Id
where id != null
select new ViewMenuItem(id.Value) {Text = result.Name})
{
item.SubItems = GetChildren(item, getLiveWireViewsByUserIdResults);
menuItems.Add(item);
}
return menuItems;
}
static void MnuViewsItemClick(object sender, Telerik.Windows.RadRoutedEventArgs e)
{
}
private void QaFullScreenClick(object sender, RoutedEventArgs e)
{
Application.Current.Host.Content.IsFullScreen
= !Application.Current.Host.Content.IsFullScreen;
}
}
}
How can I fix this?
