Ooui-tws-port/Ooui.Forms/Cells/SwitchCellRenderer.cs

80 lines
2.6 KiB
C#

using System;
using System.ComponentModel;
using Xamarin.Forms;
namespace Ooui.Forms.Cells
{
public class SwitchCellRenderer : CellRenderer
{
private static Cell _cell;
public override CellView GetCell(Cell item, CellView reusableView, List listView)
{
var nativeSwitchCell = reusableView as CellView;
Input oouiSwitch = null;
if (nativeSwitchCell == null)
nativeSwitchCell = new CellView();
else
{
oouiSwitch = nativeSwitchCell.CustomView.FirstChild as Input;
if (oouiSwitch != null)
{
nativeSwitchCell.CustomView.RemoveChild(oouiSwitch);
oouiSwitch.Click -= OnSwitchClick;
}
nativeSwitchCell.Cell.PropertyChanged -= OnCellPropertyChanged;
}
SetRealCell(item, nativeSwitchCell);
if (oouiSwitch == null)
{
oouiSwitch = new Input(InputType.Checkbox);
oouiSwitch.SetAttribute("data-toggle", "toggle");
}
var switchCell = (SwitchCell)item;
nativeSwitchCell.Cell = item;
nativeSwitchCell.SecondCol.Style.Width = "25%";
_cell = nativeSwitchCell.Cell;
nativeSwitchCell.Cell.PropertyChanged += OnCellPropertyChanged;
nativeSwitchCell.CustomView.AppendChild(oouiSwitch);
nativeSwitchCell.TextLabel.Text = switchCell.Text ?? string.Empty;
oouiSwitch.IsChecked = switchCell.On;
oouiSwitch.Click += OnSwitchClick;
WireUpForceUpdateSizeRequested(item, nativeSwitchCell);
UpdateBackground(nativeSwitchCell, item);
return nativeSwitchCell;
}
private void OnCellPropertyChanged(object sender, PropertyChangedEventArgs e)
{
var switchCell = (SwitchCell)sender;
var nativeSwitchCell = (CellView)GetRealCell(switchCell);
if (e.PropertyName == SwitchCell.OnProperty.PropertyName)
((Input)nativeSwitchCell.CustomView.FirstChild).IsChecked = switchCell.On;
else if (e.PropertyName == SwitchCell.TextProperty.PropertyName)
nativeSwitchCell.TextLabel.Text = switchCell.Text ?? string.Empty;
}
private void OnSwitchClick(object sender, EventArgs eventArgs)
{
var switchInput = (Input)sender;
CellView realCell = GetRealCell(_cell);
if (realCell != null)
((SwitchCell)realCell.Cell).On = switchInput.IsChecked;
}
}
}