C# 在xamarin中创建自定义iOS控件
我在Xamarin项目中创建了一个自定义iOS控件。但是,当它添加到Xamarin.Forms页面上的XAML中时,它当前并没有利用到该页面C# 在xamarin中创建自定义iOS控件,c#,ios,xamarin,xamarin.ios,xamarin.forms,C#,Ios,Xamarin,Xamarin.ios,Xamarin.forms,我在Xamarin项目中创建了一个自定义iOS控件。但是,当它添加到Xamarin.Forms页面上的XAML中时,它当前并没有利用到该页面 <OnPlatform.iOS> <iOSControls:CellContent BindingContext="{Binding}" CellData="{Binding VM.CellCollection}"/> </OnPlatform.iOS> 我也不确定这是否是将ViewModel中的数据绑定到
<OnPlatform.iOS>
<iOSControls:CellContent BindingContext="{Binding}" CellData="{Binding VM.CellCollection}"/>
</OnPlatform.iOS>
我也不确定这是否是将ViewModel中的数据绑定到控件的正确方法,并且由于它没有加载,我无法测试这一点
CellContent类如下所示
`Public partial class CellContent : UIView
{
#region [ Private Fields ]
/// <summary>
/// The cell data model used for generating each cell
/// </summary>
private ICell cellData;
#endregion
#region [ Constructor ]
/// <summary>
/// Initializes a new instance of the <see cref="CellContent" /> class.
/// </summary>
/// <param name="handle">handle pointer passed to the base class</param>
public CellContent(IntPtr handle) : base(handle)
{
}
#endregion
#region [ Public Properties ]
/// <summary>
/// Gets or sets the cell data model
/// </summary>
[Export("CellData"), Browsable(true)]
public ICell CellData
{
get
{
return this.cellData;
}
set
{
this.cellData = value;
}
}
#endregion
#region [ UIView Events ]
/// <summary>
/// Static control generator
/// </summary>
/// <returns>A control instance</returns>
public static CellContent Create()
{
var arr = NSBundle.MainBundle.LoadNib("CellContent", null, null);
var v = Runtime.GetNSObject<CellContent>(arr.ValueAt(0));
return v;
}
/// <summary>
/// Initialises the sub controls
/// </summary>
public override void AwakeFromNib()
{
base.AwakeFromNib();
HorizontalGridLines horizontalRows = HorizontalGridLines.Create();
VerticalGridLines verticalRows = VerticalGridLines.Create();
PlottedActivity plottedActivity = PlottedActivity.Create();
horizontalRows.VM = this.CellData;
verticalRows.VM = this.CellData;
plottedActivity.VM = this.CellData;
this.AddSubview(horizontalRows);
this.AddSubview(verticalRows);
this.AddSubview(plottedActivity);
}
#endregion`
`Public分部类CellContent:UIView
{
#区域[专用字段]
///
///用于生成每个单元的单元数据模型
///
私人ICell手机数据;
#端区
#区域[构造器]
///
///初始化类的新实例。
///
///传递给基类的句柄指针
公共CellContent(IntPtr句柄):基本(句柄)
{
}
#端区
#地区〔公共物业〕
///
///获取或设置单元格数据模型
///
[导出(“CellData”),可浏览(真实)]
公共ICell手机数据
{
得到
{
返回此.cellData;
}
设置
{
this.cellData=值;
}
}
#端区
#区域[查看事件]
///
///静态控制发生器
///
///控件实例
公共静态CellContent创建()
{
var arr=NSBundle.MainBundle.LoadNib(“CellContent”,null,null);
var v=Runtime.GetNSObject(arr.ValueAt(0));
返回v;
}
///
///初始化子控件
///
公共重写void AwakeFromNib()
{
base.AwakeFromNib();
HorizontalGridLines horizontalRows=HorizontalGridLines.Create();
VerticalGridLines verticalRows=VerticalGridLines.Create();
PlottedActivity PlottedActivity=PlottedActivity.Create();
horizontalRows.VM=this.CellData;
verticalRows.VM=this.CellData;
plottedActivity.VM=this.CellData;
此.AddSubview(水平行);
此.AddSubview(垂直行);
此.AddSubview(plottedActivity);
}
#端区`
水平/垂直网格线和绘制的活动文件基本相同,我已经验证了它们在单独的项目中工作(没有绑定或从XAML实例化),但是水平网格线文件也可以在下面看到以供参考
`public partial class HorizontalGridLines : UIView
{
/// <summary>
/// Initializes a new instance of the <see cref="HorizontalGridLines" /> class.
/// </summary>
/// <param name="handle">handle pointer passed to the base class</param>
public HorizontalGridLines(IntPtr handle) : base(handle)
{
}
/// <summary>
/// Gets or sets the data context cast as an interface for binding
/// </summary>
[Export("CellData"), Browsable(true)]
public ICell CellData{ get; set; }
/// <summary>
/// Static control generator
/// </summary>
/// <returns>A control instance</returns>
public static HorizontalGridLines Create()
{
var arr = NSBundle.MainBundle.LoadNib("HorizontalGridLines", null, null);
var v = Runtime.GetNSObject<HorizontalGridLines>(arr.ValueAt(0));
return v;
}
/// <summary>
/// Drawing override
/// </summary>
/// <param name="rect">The content bounds</param>
public override void Draw(CGRect rect)
{
base.Draw(rect);
int numOfLines = this.CellData.ActivityRows.Count;
var context = UIGraphics.GetCurrentContext();
context.SetLineWidth(2);
context.SetLineDash(0, new nfloat[] { 3, 4 });
UIColor.Black.SetStroke();
int y = 0;
int width = (int)this.Frame.Width;
int height = (int)this.Frame.Height;
int heightPerLine = y = height / numOfLines;
for (int i = 0; i < numOfLines - 1; i++)
{
var path = new CGPath();
CGPoint[] lines = new CGPoint[2];
lines[0] = new PointF(0, y);
lines[1] = new PointF(width, y);
y += heightPerLine;
path.AddLines(lines);
path.CloseSubpath();
context.AddPath(path);
}
context.DrawPath(CGPathDrawingMode.FillStroke);
}
}`
`公共部分类HorizontalGridLines:UIView
{
///
///初始化类的新实例。
///
///传递给基类的句柄指针
公共水平网格线(IntPtr句柄):基础(句柄)
{
}
///
///获取或设置作为绑定接口的数据上下文强制转换
///
[导出(“CellData”),可浏览(真实)]
公共ICell CellData{get;set;}
///
///静态控制发生器
///
///控件实例
公共静态水平网格线创建()
{
var arr=NSBundle.MainBundle.LoadNib(“水平网格线”,null,null);
var v=Runtime.GetNSObject(arr.ValueAt(0));
返回v;
}
///
///图形替代
///
///内容界限
公共覆盖无效绘制(CGRect rect)
{
基础绘制(rect);
int numOfLines=this.CellData.ActivityRows.Count;
var context=UIGraphics.GetCurrentContext();
设置线宽(2);
SetLineDash(0,新的nfloat[]{3,4});
UIColor.Black.SetStroke();
int y=0;
int width=(int)this.Frame.width;
int height=(int)this.Frame.height;
int heightPerLine=y=高度/单位线;
对于(int i=0;i
任何帮助都将不胜感激,谢谢!:)因此我找到了这样做的方法:
- 在已创建的自定义控件上,创建要将数据分配给的公共属性
- 在XAML上,将{Binding.}分配给刚刚创建的公共属性,前提是它们的类型相同
- 使用LayoutSubviews()方法期间/之后,可以从自定义控件中访问数据
BindingContext属性似乎是标准Xamarin控件的一部分,而不是自定义本机控件。只是一个瞎猜…试试
BindingContext=“{Binding.}”
(是的,一个要点)。我认为您没有像现在这样绑定任何内容。从技术上讲,在绑定之后不添加任何内容与绑定是一样的。
但是
在我看来更为明确。要真正告诉您这个问题,我们需要查看CellContent
的代码和任何自定义的呈现程序代码ccompanies it.agree@hvaughan3请提供复制的示例项目。@hvaughan3我已经添加了一些类供您参考!