【问题标题】:Binding a Grouped Table View using Xamarin.iOS and MvvmCross使用 Xamarin.iOS 和 MvvmCross 绑定分组表视图
【发布时间】:2014-05-23 14:35:14
【问题描述】:

我正在尝试使用 Xamarin.iOS 和 MvvmCross 创建分组表视图。但是无法正确绑定部分,我的 ItemSource 始终为 null,并且 ViewModel 中的 RaisePropertyChanged 不会触发我的 ItemsSource 的设置器。我查看了 Stuart 在Creating UITable with section using Mono touch and slodge mvvmcross 中提到的会议样本,但我目前卡在了我的位置。

这是我正在使用的 TableSource:

public class VoiceMessagesTableSource : MvxTableViewSource
{
    private List<VoiceMessagesTableItemGroup> _itemsSource;

    private const string _cellNibName = "MessagesTableCell";
    private static readonly NSString _cellIdentifier = new NSString(_cellNibName);

    public VoiceMessagesTableSource(UITableView tableView) : base(tableView)
    {
        tableView.RegisterNibForCellReuse(UINib.FromName(_cellNibName, NSBundle.MainBundle), _cellIdentifier);
    }

    public List<VoiceMessagesTableItemGroup> ItemsSource
    {
        get
        {
            return _itemsSource;
        }

        set
        {
            _itemsSource = value;
            ReloadTableData();
        }
    }

    public override int NumberOfSections(UITableView tableView)
    {
        if (_itemsSource == null)
        {
            return 0;
        }

        return _itemsSource.Count;
    }

    public override int RowsInSection(UITableView tableview, int section)
    {
        if (_itemsSource == null)
        {
            return 0;
        }

        return _itemsSource[section].Count;
    }

    protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
    {
        return (UITableViewCell)TableView.DequeueReusableCell(_cellIdentifier, indexPath);
    }

    protected override object GetItemAt(NSIndexPath indexPath)
    {
        if (_itemsSource == null)
        {
            return null;
        }

        return _itemsSource[indexPath.Section][indexPath.Row];
    }
}

这是我在视图中绑定它的方式:

private void BindMessagesTable()
{
    var data_source = new VoiceMessagesTableSource(MessagesTable);

    MvxFluentBindingDescriptionSet<MessagesView, MessagesViewModel> set = this.CreateBindingSet<MessagesView, MessagesViewModel>();
    //set.Bind(data_source).To(viewModel => viewModel.GroupedVoiceMessages);
    set.Bind(data_source.ItemsSource).To(viewModel => viewModel.GroupedVoiceMessages);
    set.Bind(data_source).For(s => s.SelectionChangedCommand).To(viewModel => viewModel.DisplayVoiceMessageCommand);
    set.Apply();

    MessagesTable.Source = data_source;
    MessagesTable.ReloadData();
}

这是我用作物品来源的 ItemGroup 类:

public class VoiceMessagesTableItemGroup : List<MessageEntryViewModel>
{
    public VoiceMessagesTableItemGroup(string key, IEnumerable<MessageEntryViewModel> items) : base(items)
    {
        Key = key;
    }

    public string Key { get; set; }
}

【问题讨论】:

    标签: c# ios xamarin.ios xamarin mvvmcross


    【解决方案1】:

    我没有分析问题中的所有代码,但我看到的一个问题是,您似乎在尝试 Bind 错误的目标。

    当你写作时:

    set.Bind(foo).To(viewModel => viewModel.Bar);
    

    然后这会尝试将 foo 上的默认绑定属性绑定到 ViewModel 的 Bar 属性。

    当你写作时:

    set.Bind(foo).For(view => view.Zippy).To(viewModel => viewModel.Bar);
    

    然后这会尝试将 foo 上的 Zippy 属性绑定到 ViewModel 的 Bar 属性。

    那么,你的台词:

    set.Bind(data_source.ItemsSource).To(viewModel => viewModel.GroupedVoiceMessages);
    

    尝试将null ItemsSource 上的未知属性绑定到GroupedVoiceMessages

    这显然行不通 - 应该在跟踪中显示一些关于 null 的警告。

    改为尝试:

    set.Bind(data_source).For(v => v.ItemsSource).To(viewModel => viewModel.GroupedVoiceMessages);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多