public static UITableViewSource ParseList(DialogViewController controller, MemberData memberData, List<Type> viewTypes)
{
object memberValue = memberData.Value;
var member = memberData.Member;
var type = memberData.Type;
var isList = typeof(IEnumerable).IsAssignableFrom(type) || typeof(Enum).IsAssignableFrom(type);
if (isList)
{
var data = type.CreateGenericListFromEnumerable(memberValue);
var source = new ListSource(controller, (IList)data, viewTypes);
if (source != null)
{
if (type.IsEnum)
{
source.SelectedItem = memberValue;
source.SelectedItems.Add(source.SelectedItem);
}
else if (data != null && data.Count == 1)
{
source.SelectedItem = data[0];
source.SelectedItems.Add(source.SelectedItem);
}
source.Caption = GetCaption(member);
var listAttribute = member.GetCustomAttribute<ListAttribute>();
if (listAttribute != null)
{
source.DisplayMode = listAttribute.DisplayMode;
source.SelectionAction = listAttribute.SelectionAction;
source.IsMultiselect = listAttribute.SelectionAction == SelectionAction.Multiselection;
source.IsSelectable = source.SelectionAction != SelectionAction.NavigateToView;
source.IsNavigable = listAttribute.DisplayMode != DisplayMode.Collapsable || listAttribute.SelectionAction == SelectionAction.NavigateToView;
source.SelectedAccessoryViewType = listAttribute.SelectedAccessoryViewType;
source.UnselectedAccessoryViewType = listAttribute.UnselectedAccessoryViewType;
source.UnselectionBehavior = listAttribute.UnselectionBehavior;
source.ReplaceCaptionWithSelection = listAttribute.ReplaceCaptionWithSelection;
if (!string.IsNullOrEmpty(listAttribute.SelectedItemMemberName))
{
source.SelectedItemMemberName = listAttribute.SelectedItemMemberName;
}
if (!string.IsNullOrEmpty(listAttribute.SelectedItemsMemberName))
{
source.SelectedItemsMemberName = listAttribute.SelectedItemsMemberName;
}
}
source.PopOnSelection = source.SelectionAction == SelectionAction.PopOnSelection;
var memberAttributes = member.GetCustomAttributes(false);
foreach(var memberAttribute in memberAttributes)
{
var navigable = memberAttribute as INavigable;
if (navigable != null)
{
source.IsSelectable = false;
source.NavigationViewType = navigable.NavigateToViewType;
source.IsNavigable = navigable.NavigateToViewType != null;
}
}
source.IsRootCell = source.DisplayMode != DisplayMode.List;
return source;
}
}
return null;
}