public override void ViewDidLoad() { base.ViewDidLoad(); TableView.RowHeight = UITableView.AutomaticDimension; TableView.EstimatedRowHeight = 44f; var vm = (IssueAddViewModel)ViewModel; var saveButton = new UIBarButtonItem { Image = Images.Buttons.SaveButton }; NavigationItem.RightBarButtonItem = saveButton; var title = new EntryElement("Title", string.Empty, string.Empty); var assignedTo = new StringElement("Responsible", "Unassigned", UITableViewCellStyle.Value1); var milestone = new StringElement("Milestone", "None", UITableViewCellStyle.Value1); var labels = new StringElement("Labels", "None", UITableViewCellStyle.Value1); var content = new MultilinedElement("Description"); Root.Reset(new Section { title, assignedTo, milestone, labels }, new Section { content }); OnActivation(d => { d(vm.Bind(x => x.IssueTitle, true).Subscribe(x => title.Value = x)); d(title.Changed.Subscribe(x => vm.IssueTitle = x)); d(vm.Bind(x => x.Content, true).Subscribe(x => content.Details = x)); d(labels.Clicked.Subscribe(_ => vm.GoToLabelsCommand.Execute(null))); d(milestone.Clicked.Subscribe(_ => vm.GoToMilestonesCommand.Execute(null))); d(assignedTo.Clicked.Subscribe(_ => vm.GoToAssigneeCommand.Execute(null))); d(vm.Bind(x => x.IsSaving).SubscribeStatus("Saving...")); d(vm.Bind(x => x.AssignedTo, true).Subscribe(x => { assignedTo.Value = x == null ? "Unassigned" : x.Login; })); d(vm.Bind(x => x.Milestone, true).Subscribe(x => { milestone.Value = x == null ? "None" : x.Title; })); d(vm.BindCollection(x => x.Labels, true).Subscribe(_ => { labels.Value = vm.Labels.Items.Count == 0 ? "None" : string.Join(", ", vm.Labels.Items.Select(i => i.Name)); })); d(saveButton.GetClickedObservable().Subscribe(_ => { View.EndEditing(true); vm.SaveCommand.Execute(null); })); d(content.Clicked.Subscribe(_ => { var composer = new MarkdownComposerViewController { Title = "Issue Description", Text = content.Details }; composer.NewComment(this, (text) => { vm.Content = text; composer.CloseComposer(); }); })); }); }
protected void UpdateView() { ICollection<Section> sections = new LinkedList<Section>(); var section = new Section(); sections.Add(section); var desc = new MultilinedElement("Description", ViewModel.Description); desc.Clicked.Subscribe(_ => ChangeDescription()); section.Add(desc); var pub = new BooleanElement("Public", ViewModel.Public); pub.Changed.Subscribe(x => ViewModel.Public = x); section.Add(pub); var fileSection = new Section(); sections.Add(fileSection); foreach (var file in ViewModel.Files.Keys) { var key = file; if (string.IsNullOrEmpty(ViewModel.Files[file])) continue; var size = System.Text.Encoding.UTF8.GetByteCount(ViewModel.Files[file]); var el = new StringElement(file, size + " bytes", UITableViewCellStyle.Subtitle) { Accessory = UITableViewCellAccessory.DisclosureIndicator }; el.Clicked.Subscribe(_ => { if (!ViewModel.Files.ContainsKey(key)) return; var createController = new GistFileEditViewController { Filename = key, Content = ViewModel.Files[key] }; createController.SaveCommand.Subscribe(__ => NavigationController.PopToViewController(this, true)); createController.Save = (name, content) => { if (string.IsNullOrEmpty(name)) throw new InvalidOperationException("Please enter a name for the file"); //If different name & exists somewhere else if (!name.Equals(key) && ViewModel.Files.ContainsKey(name)) throw new InvalidOperationException("A filename by that type already exists"); ViewModel.Files.Remove(key); ViewModel.Files[name] = content; ViewModel.Files = ViewModel.Files; // Trigger refresh }; NavigationController.PushViewController(createController, true); }); fileSection.Add(el); } var add = new StringElement("Add New File"); add.Clicked.Subscribe(_ => AddFile()); fileSection.Add(add); Root.Reset(sections); }