我尝试做的是创建一个带有 TextBox、Button 和 TableView 的屏幕。我已经创建了 xib,添加了元素并为按钮/文本框和 TableView 创建了出口。
我确实有一个核心项目,它是一个 PCL,并且包含 ViewModel:
public class MainViewModel : MvxViewModel
{
public MainViewModel()
{
CardSets = new ObservableCollection<CardSet>
{
new CardSet {Name = "First Entry", Description = "First Entry Description"},
new CardSet {Name = "Second Entry", Description = "Second Entry Description"}
};
}
private ObservableCollection<CardSet> _sets;
public ObservableCollection<CardSet> CardSets {
get{
return _sets;}
set{
_sets=value;
}}
实际上为了测试,我立即开始使用列表中的模型。该模型如下所示:
public class CardSet
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
比我在控制器的 .cs-File 上创建绑定:
[MvxViewFor(typeof(MainViewModel))]
public partial class TestViewController : MvxViewController
{
public TestViewController () : base ("TestViewController", null)
{
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
var tableSource = new CardSetTableViewSource(ListViewOutlet);
this.AddBindings(new Dictionary<object, string>()
{
{tableSource, "ItemsSource CardSets; SelectionChangedCommand SearchCardSetsCommand"}
});
ListViewOutlet.Source = tableSource;
ListViewOutlet.ReloadData();
}
}
据我了解,我将 TableView 的 ItemsSource(不小心称为 ListViewOutlet .. XD)绑定到我的 ViewModels CardSets-Property。
CardSetTableViewSource 如下所示:
public class CardSetTableViewSource : MvxTableViewSource
{
static readonly NSString CellIdentifier = new NSString("ClientCell");
public CardSetTableViewSource(UITableView tableView)
: base(tableView)
{
}
protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
{
UITableViewCell cell = tableView.DequeueReusableCell(CellIdentifier);
if (cell == null)
{
cell = new CardSetTableViewCell(UITableViewCellStyle.Subtitle, CellIdentifier);
cell.Accessory = UITableViewCellAccessory.DisclosureIndicator;
}
return cell;
}
public override string TitleForHeader(UITableView tableView, int section)
{
return string.Empty;
}
}
和单元实现:
public class CardSetTableViewCell : MvxTableViewCell
{
public const string BindingText = @"TitleText Name";
public static readonly MvxBindingDescription[] BindingDescriptions
= new []
{
new MvxBindingDescription()
{
TargetName = "TitleText",
SourcePropertyPath = "Name"
},
};
public CardSetTableViewCell(UITableViewCellStyle cellStyle, NSString cellIdentifier)
: base(BindingDescriptions, cellStyle, cellIdentifier)
{
}
}
所以现在的问题是:标题未显示在列表项中。实际上,绑定似乎在列表显示拖曳项目时起作用。我的绑定也适用于 TextBox 和 Button。所以这不是问题。在调试之后。输出:
2013-04-14 13:03:43.178 KaptaiOS[91851:c07] mvx: Diagnostic: 0.06 Showing ViewModel MainViewModel
2013-04-14 13:03:43.180 KaptaiOS[91851:c07] TouchNavigation: Diagnostic: 0.06 Navigate requested
2013-04-14 13:03:43.287 KaptaiOS[91851:c07] MvxBind: Diagnostic: 0.17 Receiving setValue to
2013-04-14 13:03:43.296 KaptaiOS[91851:c07] MvxBind: Diagnostic: 0.18 Receiving setValue to System.Collections.ObjectModel.ObservableCollection`1[KaptaCore.Model.CardSet]
2013-04-14 13:03:43.298 KaptaiOS[91851:c07] MvxBind: Diagnostic: 0.18 Receiving setValue to Cirrious.MvvmCross.ViewModels.MvxCommand
2013-04-14 13:03:43.306 KaptaiOS[91851:c07] MvxBind: Warning: 0.19 Failed to create target binding for from Name to TitleText
2013-04-14 13:03:43.308 KaptaiOS[91851:c07] MvxBind: Warning: 0.19 Failed to create target binding for from Name to TitleText
知道有什么问题吗?我在 Mac 上的 Xamarin Studio 中运行所有这些东西。我使用最新的稳定 XS。MvvmCross 构建大约 1 周大。
我已经添加了一个 LinkerIncludePlease.cs-File 来添加 Name-Property 的使用。但是当我在调试模式下在模拟器中运行链接器完全禁用时,这应该不是问题。
更新:
在阅读了一些教程并观看了一些视频后,我确实有一个解决方案:http: //opendix.blogspot.ch/2013/04/binding-viewmodel-to-simple-uitableview.html
续我可以说:当你只想展示一个很简单的UITableView时,那就用“MvxStandardTableViewSource”-class而不是自己写一个TableViewSource/cells。当您需要自定义单元格时,请观看 stuart 建议的视频。您必须为单元创建一个 .xib 文件,并在自定义单元实现中实现绑定。