1

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

4

1 回答 1

2

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

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

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

除此之外:

于 2013-04-14T20:09:40.000 回答