使用Xamarin绑定分组表视图.iOS和MvvmCross

本文关键字:视图 iOS MvvmCross Xamarin 绑定 使用 | 更新日期: 2023-09-27 18:04:32

我正在尝试使用Xamarin创建分组表视图。iOS和MvvmCross。但是不能得到正确的绑定部分,我的ItemSource总是null和ViewModel中的RaisePropertyChanged不会触发我的ItemsSource的setter。我已经看过Stuart在使用Mono touch和slodge mvvmcross创建UITable部分中提到的会议样本,但我目前被困在我所在的地方。

这是我正在使用的表源:

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; }
}

使用Xamarin绑定分组表视图.iOS和MvvmCross

我没有分析问题中的所有代码,但我可以看到的一个问题是,看起来您正在尝试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);