Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在xamarin中创建自定义iOS控件_C#_Ios_Xamarin_Xamarin.ios_Xamarin.forms - Fatal编程技术网

C# 在xamarin中创建自定义iOS控件

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中的数据绑定到

我在Xamarin项目中创建了一个自定义iOS控件。但是,当它添加到Xamarin.Forms页面上的XAML中时,它当前并没有利用到该页面

<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我已经添加了一些类供您参考!