簡體   English   中英

使用Xamarin.iOS和MvvmCross綁定分組表視圖

[英]Binding a Grouped Table View using Xamarin.iOS and MvvmCross

我正在嘗試使用Xamarin.iOS和MvvmCross創建一個分組表視圖。 但無法使綁定部分正確,我的ItemSource始終為null並且ViewModel中的RaisePropertyChanged不會觸發我的ItemsSource的setter。 我已經看過Stuart在使用Mono touch和slodge mvvmcross創建UITable時所引用的會議示例,但我目前陷入了困境。

這是我正在使用的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; }
}

我沒有分析問題中的所有代碼,但我可以看到的一個問題是,你似乎試圖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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM