将UITableView标题绑定到模型

时间:2013-04-14 11:08:41

标签: c# xamarin.ios mvvmcross

我尝试做的是创建一个带有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文件,并在自定义单元实现中实现绑定。

1 个答案:

答案 0 :(得分:2)

在我看来,您需要创建一些自定义表格单元格并将其绑定。

对于绑定表格单元格,我建议您查看http://slodge.blogspot.com/2013/01/uitableviewcell-using-xib-editor.html

此演示的代码已更新为v3 on https://github.com/slodge/MvvmCross-Tutorials/tree/master/MonoTouchCellTutorial

除此之外: