搜索了多个博客和视频后,我发现实施UITableView
可以使用MvxTableViewController
,但是对NSTableView
使用什么呢?
我找不到任何教程,该教程涵盖了使用MvvmCross绑定OSX的TableView。任何线索将不胜感激。
答案 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
中的项。