我尝试做的是创建一个带有TextBox的按钮和一个TableView的屏幕。 我创建了xib,添加了元素并为按钮/文本框和TableView创建了出口。
我有一个Core-Project,它是一个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。所以这不是问题。在debug.Output:
之后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文件,并在自定义单元实现中实现绑定。
答案 0 :(得分:2)
在我看来,您需要创建一些自定义表格单元格并将其绑定。
对于绑定表格单元格,我建议您查看http://slodge.blogspot.com/2013/01/uitableviewcell-using-xib-editor.html
此演示的代码已更新为v3 on https://github.com/slodge/MvvmCross-Tutorials/tree/master/MonoTouchCellTutorial
除此之外: