[英]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.