如何使用Xamarin.Forms在单元格中创建>?

14 xamarin xamarin.forms

我有一个应用程序,我可以更改顺序和卡的显示方式.对于拥有iOS的任何人,我需要与"设置">"联系人">"排序顺序"页面的工作方式非常相似的内容.

这显示了两行.一个是First,Last,另一个是Last,First.当用户点击一行时,它就像一个单选按钮,并在行的末尾出现一个刻度线.

我想尝试实现此功能,但我不知道从哪里开始.我应该使用ViewCell还是TextCell来完成这项工作,以及如何有任何关于如何实现它的想法

.?

Sha*_*raj 13

编辑1:iOS渲染器中的简化属性更改逻辑; 现在没有清理的参考或处理程序.

延伸到@ hankide的答案:

您可以IsChecked在扩展TextCellViewCell将VM状态绑定到它时创建可绑定属性.

public class MyTextCell : TextCell
{
    public static readonly BindableProperty IsCheckedProperty =
        BindableProperty.Create(
            "IsChecked", typeof(bool), typeof(MyTextCell),
            defaultValue: false);

    public bool IsChecked
    {
        get { return (bool)GetValue(IsCheckedProperty); }
        set { SetValue(IsCheckedProperty, value); }
    }
}
Run Code Online (Sandbox Code Playgroud)

下一步是创建侦听此属性并在iOS级别显示复选标记的渲染器.

[assembly: ExportRenderer(typeof(MyTextCell), typeof(SampleApp.iOS.MyTextCellRenderer))]
namespace SampleApp.iOS
{
    public class MyTextCellRenderer : TextCellRenderer
    {
        public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
        {
            var nativeCell = base.GetCell(item, reusableCell, tv);

            var formsCell = item as MyTextCell;
            SetCheckmark(nativeCell, formsCell);

            return nativeCell;
        }

        protected override void HandlePropertyChanged(object sender, PropertyChangedEventArgs args)
        {
            base.HandlePropertyChanged(sender, args);

            System.Diagnostics.Debug.WriteLine($"HandlePropertyChanged {args.PropertyName}");
            if (args.PropertyName == MyTextCell.IsCheckedProperty.PropertyName)
            {
                var nativeCell = sender as CellTableViewCell;
                if (nativeCell?.Element is MyTextCell formsCell)
                    SetCheckmark(nativeCell, formsCell);
            }
        }

        void SetCheckmark(UITableViewCell nativeCell, MyTextCell formsCell)
        {
            if (formsCell.IsChecked)
                nativeCell.Accessory = UITableViewCellAccessory.Checkmark;
            else
                nativeCell.Accessory = UITableViewCellAccessory.None;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

样品用法1

并且,样本用法如下:

<TableView Intent="Settings">
    <TableSection Title="Sort Order">
        <local:MyTextCell Text="First Last" IsChecked="false" />
        <local:MyTextCell Text="Last, First" IsChecked="true" />
    </TableSection>
</TableView>
Run Code Online (Sandbox Code Playgroud)

样品用法2

您还可以收听Tapped事件以确保IsChecked财产按预期工作.

例如,您将此属性绑定到ViewModel:

<TableView Intent="Settings">
    <TableSection Title="Sort Order">
        <local:MyTextCell Tapped="Handle_Tapped" Text="{Binding [0].Name}" IsChecked="{Binding [0].IsSelected}" />
        <local:MyTextCell Tapped="Handle_Tapped" Text="{Binding [1].Name}" IsChecked="{Binding [1].IsSelected}" />
    </TableSection>
</TableView>
Run Code Online (Sandbox Code Playgroud)

并处理点击事件:

public SettingViewModel[] Settings = new []{
    new SettingViewModel { Name = "First Last", IsSelected = false },
    new SettingViewModel { Name = "Last First", IsSelected = true },
};

void Handle_Tapped(object sender, System.EventArgs e)
{
    var cell = sender as TextCell;
    if (cell == null)
        return;

    var selected = cell.Text;
    foreach(var setting in Settings)
    {
        if (setting.Name == selected)
            setting.IsSelected = true;
        else
            setting.IsSelected = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Tim*_*äki 7

您描述的排序顺序设置页面是使用UIKit实现的UITableView.在Xamarin.Forms中,您可以使用TableView控件来获得相同的结果.

正如您将很快注意到的那样,无法使用Xamarin.Forms设置复选标记图标,因此您可能需要创建一个自定义单元格,左侧是文本,右侧是复选标记图像.

如果你真的想通过本书做所有事情,你应该创建一个自定义渲染器,允许你设置当前的Accessory属性ViewCell.但是,对于这么小的功能,这会有点复杂.