MvvmCross与NSTableView的交叉绑定

时间:2018-07-02 08:26:14

标签: macos xamarin mvvmcross nstableview

搜索了多个博客和视频后,我发现实施UITableView可以使用MvxTableViewController,但是对NSTableView使用什么呢?

我找不到任何教程,该教程涵盖了使用MvvmCross绑定OSX的TableView。任何线索将不胜感激。

1 个答案:

答案 0 :(得分:3)

对于macOS,我们没有MvxTableViewController

但是,如果您从中进行抽象,则绑定到NSTableView与iOS上的UITableView非常相似。

private NSTableView _tableView;

public override void ViewDidLoad()
{
    base.ViewDidLoad();

    _tableView = new NSTableView();

    // add constraints or size otherwise

    var source = new MvxTableViewSource(_tableView);
    _tableView.Source = source;

    var set = this.CreateBindingSet<MyViewController, MyViewModel>();
    set.Bind(source).For(v => v.ItemsSource).To(vm => vm.Items);
    set.Apply();
}

这会将ViewModel Items绑定到ItemsSource。但是,您仍然需要指定绑定单元中的内容。最简单的方法是提供一个TableColumn。

var column = new MvxTableColumn();
column.Identifier = "First";
column.BindingText = "Text Name";
column.HeaderCell = new NSCell("Example");
_tableView.AddColumn(column);

这会将TableColumn的Text属性绑定到ViewModel Name中提供的项目中的Items

如果您需要的还不止这些,则需要继承MvxTableViewSource的子类并覆盖GetOrCreateViewFor,并在其中提供您自己的MvxTableCellView的子类,您可以在其中进行更多操作。看起来可能如下所示。

public class MyCustomCell : MvxTableCellView
{
    public MyCustomCell(IntPtr handle) : base(handle)
    {
    }

    public MyCustomCell(string bindingText) : base(bindingText)
    {
        this.Frame = new CGRect(0, 0, 100, 50);
        TextField = new NSTextField(new CGRect(50, 0, 100, 50))
        {
            Editable = false,
            Bordered = false
        };

        ImageView = new NSImageView(new CGRect(0, 0, 50, 50));

        AddSubview(TextField);
        AddSubview(ImageView);
        this.Initialize(bindingText);
    }

    private string _imageUrl;
    public string ImageUrl
    {
        get => _imageUrl;
        set
        {
            _imageUrl = value;
            ImageService.Instance.LoadUrl(_imageUrl).Into(ImageView);
        }
    }
}

表源:

public class MyTableSource : MvxTableViewSource
{
    private string _bindingText;

    public MyTableSource(NSTableView tableView, string bindingText) : base(tableView)
    {
        _bindingText = bindingText;
    }

    public override NSView GetViewForItem(NSTableView tableView, NSTableColumn tableColumn, nint row)
    {
        if (ItemsSource == null)
            return null;

        var item = ItemsSource.ElementAt((int)row);
        var view = new MyCustomCell(_bindingText);

        if (view is IMvxDataConsumer bindable)
            bindable.DataContext = item;

        return view;
    }
}

然后,在第一个示例中不要使用MvxTableViewSource,而要使用自己的MyTableSource

var source = new MyTableViewSource(_tableView, "Text Name; ImageUrl Url");
_tableView.Source = source;

{{1}中绑定到Name的{​​{1}}和Url中的项。