私がやろうとしているのは、TextBox、Button、および TableView を使用して Screen を作成することです。私はxibを作成し、要素を追加し、ボタン/テキストボックスとTableViewのアウトレットを作成しました。
PCL であり、ViewModel を含む Core-Project があります。
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)
{
}
}
さて、問題は、タイトルがリスト項目に表示されないことです。リストには2つのアイテムが表示されるため、実際にはバインディングが機能しているようです。私のバインディングは 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 週間前のものです。
Name-Property の使用法を追加するために、既に LinkerIncludePlease.cs-File を追加しています。しかし、リンカを完全に無効にしてデバッグモードでシミュレータを実行しているので、これは問題になりません。
アップデート:
いくつかのチュートリアルを読み、いくつかのビデオを見た後、解決策があります: http://opendix.blogspot.ch/2013/04/binding-viewmodel-to-simple-uitableview.html
私が言うことができる再開:非常に単純なUITableViewのみを表示したい場合は、独自のTableViewSource/cellsを書く代わりに「MvxStandardTableViewSource」クラスを使用してください。カスタム セルが必要な場合は、Stuart が提案したビデオをご覧ください。セルの .xib-File を作成し、custom-cell 実装でバインディングを実装する必要があります。