1

私がやろうとしているのは、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 実装でバインディングを実装する必要があります。

4

1 に答える 1