コード例 #1
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            NameTakenErrorLabel.Text  = Resources.NameTakenError;
            TitleLabel.Text           = Resources.NewProject;
            NameTextField.Placeholder = Resources.ProjectName;
            DoneButton.SetTitle(Resources.Create, UIControlState.Normal);

            var heightConverter = new BoolToConstantValueConverter <nfloat>(nameAlreadyTakenHeight, 0);

            var bindingSet = this.CreateBindingSet <EditProjectViewController, EditProjectViewModel>();

            PrivateProjectSwitch.SetState(ViewModel.IsPrivate, false);

            //Commands
            bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand);
            bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand);
            bindingSet.Bind(ColorPickerOpeningView)
            .For(v => v.BindTap())
            .To(vm => vm.PickColorCommand);

            bindingSet.Bind(ClientLabel)
            .For(v => v.BindTap())
            .To(vm => vm.PickClientCommand);

            bindingSet.Bind(WorkspaceLabel)
            .For(v => v.BindTap())
            .To(vm => vm.PickWorkspaceCommand);

            bindingSet.Bind(ProjectNameUsedErrorTextHeight)
            .For(v => v.Constant)
            .To(vm => vm.IsNameAlreadyTaken)
            .WithConversion(heightConverter);

            bindingSet.Bind(PrivateProjectSwitch)
            .For(v => v.BindValueChanged())
            .To(vm => vm.TogglePrivateProjectCommand);

            //State
            bindingSet.Bind(NameTextField).To(vm => vm.Name);
            bindingSet.Bind(WorkspaceLabel).To(vm => vm.WorkspaceName);

            bindingSet.Bind(ColorCircleView)
            .For(v => v.BackgroundColor)
            .To(vm => vm.Color)
            .WithConversion(new MvxNativeColorValueConverter());

            bindingSet.Bind(DoneButton)
            .For(v => v.Enabled)
            .To(vm => vm.SaveEnabled);

            bindingSet.Bind(ClientLabel)
            .For(v => v.AttributedText)
            .To(vm => vm.ClientName)
            .WithConversion(new AddNewAttributedStringConverter(Resources.AddClient, ClientLabel.Font.CapHeight));

            bindingSet.Apply();
        }
コード例 #2
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            TimeLabel.Font = TimeLabel.Font.GetMonospacedDigitFont();

            this.DelayBind(() =>
            {
                var colorConverter      = new MvxRGBValueConverter();
                var visibilityConverter = new MvxVisibilityValueConverter();
                var timeSpanConverter   = new TimeSpanToDurationValueConverter();
                var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(HasProjectDistance, NoProjectDistance);

                var bindingSet = this.CreateBindingSet <TimeEntriesLogViewCell, TimeEntryViewModel>();

                //Text
                bindingSet.Bind(ProjectLabel).To(vm => vm.ProjectName);
                bindingSet.Bind(DescriptionLabel).To(vm => vm.Description);
                bindingSet.Bind(TimeLabel)
                .To(vm => vm.Duration)
                .WithConversion(timeSpanConverter);

                //Color
                bindingSet.Bind(ProjectLabel)
                .For(v => v.TextColor)
                .To(vm => vm.ProjectColor)
                .WithConversion(colorConverter);

                bindingSet.Bind(ProjectDotView)
                .For(v => v.BackgroundColor)
                .To(vm => vm.ProjectColor)
                .WithConversion(colorConverter);

                //Visibility
                bindingSet.Bind(DescriptionTopDistanceConstraint)
                .For(v => v.Constant)
                .To(vm => vm.HasProject)
                .WithConversion(descriptionTopDistanceValueConverter);

                bindingSet.Bind(ProjectLabel)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasProject)
                .WithConversion(visibilityConverter);

                bindingSet.Bind(ProjectDotView)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasProject)
                .WithConversion(visibilityConverter);

                bindingSet.Bind(TaskLabel)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasProject)
                .WithConversion(visibilityConverter);

                bindingSet.Apply();
            });
        }
コード例 #3
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            ContentView.BackgroundColor = UIColor.White;
            FadeView.Layer.AddSublayer(new CAGradientLayer
            {
                Colors     = new[] { UIColor.White.ColorWithAlpha(0.0f).CGColor, UIColor.White.CGColor },
                Locations  = new[] { new NSNumber(0.0f), new NSNumber(0.2f) },
                StartPoint = new CGPoint(0.0, 0.5),
                EndPoint   = new CGPoint(1.0, 0.5),
                Frame      = FadeView.Bounds
            });

            StartButton.TouchUpInside += onStartButtonTap;

            this.DelayBind(() =>
            {
                var colorConverter      = new MvxRGBValueConverter();
                var visibilityConverter = new MvxVisibilityValueConverter();
                var timeSpanConverter   = new TimeSpanToDurationValueConverter();
                var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(HasProjectDistance, NoProjectDistance);
                var projectTaskClientCombiner            = new ProjectTaskClientValueCombiner(
                    ProjectTaskClientLabel.Font.CapHeight,
                    Color.Suggestions.ClientColor.ToNativeColor(),
                    true
                    );

                var bindingSet = this.CreateBindingSet <SuggestionsViewCell, Suggestion>();

                //Text
                bindingSet.Bind(DescriptionLabel).To(vm => vm.Description);
                bindingSet.Bind(ProjectTaskClientLabel)
                .For(v => v.AttributedText)
                .ByCombining(projectTaskClientCombiner,
                             v => v.ProjectName,
                             v => v.TaskName,
                             v => v.ClientName,
                             v => v.ProjectColor);

                //Visibility
                bindingSet.Bind(DescriptionTopDistanceConstraint)
                .For(v => v.Constant)
                .To(vm => vm.HasProject)
                .WithConversion(descriptionTopDistanceValueConverter);

                bindingSet.Bind(ProjectTaskClientLabel)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasProject)
                .WithConversion(visibilityConverter);

                bindingSet.Apply();
            });
        }
コード例 #4
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            ContentView.BackgroundColor = UIColor.White;

            this.DelayBind(() =>
            {
                var colorConverter      = new MvxRGBValueConverter();
                var visibilityConverter = new MvxVisibilityValueConverter();
                var timeSpanConverter   = new TimeSpanToDurationValueConverter();
                var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(HasProjectDistance, NoProjectDistance);

                var bindingSet = this.CreateBindingSet <SuggestionsViewCell, Suggestion>();

                //Text
                bindingSet.Bind(ProjectLabel).To(vm => vm.ProjectName);
                bindingSet.Bind(DescriptionLabel).To(vm => vm.Description);

                //Color
                bindingSet.Bind(ProjectLabel)
                .For(v => v.TextColor)
                .To(vm => vm.ProjectColor)
                .WithConversion(colorConverter);

                bindingSet.Bind(ProjectDotView)
                .For(v => v.BackgroundColor)
                .To(vm => vm.ProjectColor)
                .WithConversion(colorConverter);

                //Visibility
                bindingSet.Bind(DescriptionTopDistanceConstraint)
                .For(v => v.Constant)
                .To(vm => vm.HasProject)
                .WithConversion(descriptionTopDistanceValueConverter);

                bindingSet.Bind(ProjectLabel)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasProject)
                .WithConversion(visibilityConverter);

                bindingSet.Bind(ProjectDotView)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasProject)
                .WithConversion(visibilityConverter);

                bindingSet.Bind(TaskLabel)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasProject)
                .WithConversion(visibilityConverter);

                bindingSet.Apply();
            });
        }
コード例 #5
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            Title = Resources.LoginForgotPassword;

            prepareViews();

            var boolInverter = new BoolToConstantValueConverter <bool>(false, true);
            var resetPasswordButtonTitleConverter = new BoolToConstantValueConverter <string>("", Resources.GetPasswordResetLink);

            var bindingSet = this.CreateBindingSet <ForgotPasswordViewController, ForgotPasswordViewModel>();

            //Text
            bindingSet.Bind(ErrorLabel).To(vm => vm.ErrorMessage);
            bindingSet.Bind(EmailTextField)
            .To(vm => vm.Email)
            .WithConversion(new EmailToStringValueConverter());

            bindingSet.Bind(ResetPasswordButton)
            .For(v => v.BindAnimatedTitle())
            .To(vm => vm.IsLoading)
            .WithConversion(resetPasswordButtonTitleConverter);

            //Visibility
            bindingSet.Bind(ErrorLabel)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.HasError);

            bindingSet.Bind(DoneCard)
            .For(v => v.BindVisibilityWithFade())
            .To(vm => vm.PasswordResetSuccessful);

            bindingSet.Bind(ResetPasswordButton)
            .For(v => v.BindVisibilityWithFade())
            .To(vm => vm.PasswordResetSuccessful)
            .WithConversion(boolInverter);

            bindingSet.Bind(EmailTextField)
            .For(v => v.BindFirstResponder())
            .To(vm => vm.PasswordResetSuccessful)
            .Mode(MvxBindingMode.OneWay)
            .WithConversion(boolInverter);

            bindingSet.Bind(ActivityIndicator)
            .For(v => v.BindVisibilityWithFade())
            .To(vm => vm.IsLoading);

            //Commands
            bindingSet.Bind(ResetPasswordButton).To(vm => vm.ResetCommand);

            bindingSet.Apply();
        }
コード例 #6
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            prepareViews();

            this.DelayBind(() =>
            {
                var backgroundColorConverter
                    = new BoolToConstantValueConverter <UIColor>(
                          Color.Calendar.SelectedDayBackgoundColor.ToNativeColor(),
                          Color.Common.Transparent.ToNativeColor());

                var todayVisibilityConverter = new MvxVisibilityValueConverter();

                var bindingSet = this.CreateBindingSet <ReportsCalendarViewCell, CalendarDayViewModel>();

                //Text
                bindingSet.Bind(Text).To(vm => vm.Day);

                //Color
                bindingSet.Bind(Text)
                .For(v => v.TextColor)
                .ByCombining(new CalendarCellTextColorValueCombiner(),
                             v => v.IsInCurrentMonth,
                             v => v.Selected);

                bindingSet.Bind(BackgroundView)
                .For(v => v.BackgroundColor)
                .To(vm => vm.Selected)
                .WithConversion(backgroundColorConverter);

                //Rounding
                bindingSet.Bind(BackgroundView)
                .For(v => v.RoundLeft)
                .To(vm => vm.IsStartOfSelectedPeriod);

                bindingSet.Bind(BackgroundView)
                .For(v => v.RoundRight)
                .To(vm => vm.IsEndOfSelectedPeriod);

                //Today
                bindingSet.Bind(TodayBackgroundView)
                .For(v => v.BindVisibility())
                .To(vm => vm.IsToday)
                .WithConversion(todayVisibilityConverter);

                bindingSet.Apply();
            });

            AddGestureRecognizer(new UITapGestureRecognizer(
                                     () => CellTappedCommand?.Execute((CalendarDayViewModel)DataContext)));
        }
コード例 #7
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();

            var heightConverter = new BoolToConstantValueConverter <nfloat>(nameAlreadyTakenHeight, 0);

            var bindingSet = this.CreateBindingSet <EditProjectViewController, EditProjectViewModel>();

            //Commands
            bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand);
            bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand);
            bindingSet.Bind(ColorCircleView)
            .For(v => v.BindTap())
            .To(vm => vm.PickColorCommand);

            bindingSet.Bind(ClientLabel)
            .For(v => v.BindTap())
            .To(vm => vm.PickClientCommand);

            bindingSet.Bind(WorkspaceLabel)
            .For(v => v.BindTap())
            .To(vm => vm.PickWorkspaceCommand);

            bindingSet.Bind(ProjectNameUsedErrorTextHeight)
            .For(v => v.Constant)
            .To(vm => vm.IsNameAlreadyTaken)
            .WithConversion(heightConverter);

            //State
            bindingSet.Bind(NameTextField).To(vm => vm.Name);
            bindingSet.Bind(WorkspaceLabel).To(vm => vm.WorkspaceName);
            bindingSet.Bind(PrivateProjectSwitch).To(vm => vm.IsPrivate);
            bindingSet.Bind(ColorCircleView)
            .For(v => v.BackgroundColor)
            .To(vm => vm.Color)
            .WithConversion(new MvxNativeColorValueConverter());

            bindingSet.Bind(DoneButton)
            .For(v => v.Enabled)
            .To(vm => vm.SaveEnabled);

            bindingSet.Bind(ClientLabel)
            .For(v => v.AttributedText)
            .To(vm => vm.ClientName)
            .WithConversion(new AddNewAttributedStringConverter(Resources.AddClient, ClientLabel.Font.CapHeight));

            bindingSet.Apply();
        }
コード例 #8
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            ContentView.BackgroundColor = UIColor.White;
            FadeView.FadeRight          = true;

            StartButton.TouchUpInside += onStartButtonTap;

            this.DelayBind(() =>
            {
                var colorConverter      = new MvxRGBValueConverter();
                var visibilityConverter = new MvxVisibilityValueConverter();
                var timeSpanConverter   = new TimeSpanToDurationValueConverter();
                var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(HasProjectDistance, NoProjectDistance);
                var projectTaskClientCombiner            = new ProjectTaskClientValueCombiner(
                    ProjectTaskClientLabel.Font.CapHeight,
                    Color.Suggestions.ClientColor.ToNativeColor(),
                    true
                    );

                var bindingSet = this.CreateBindingSet <SuggestionsViewCell, Suggestion>();

                //Text
                bindingSet.Bind(DescriptionLabel).To(vm => vm.Description);
                bindingSet.Bind(ProjectTaskClientLabel)
                .For(v => v.AttributedText)
                .ByCombining(projectTaskClientCombiner,
                             v => v.ProjectName,
                             v => v.TaskName,
                             v => v.ClientName,
                             v => v.ProjectColor);

                //Visibility
                bindingSet.Bind(DescriptionTopDistanceConstraint)
                .For(v => v.Constant)
                .To(vm => vm.HasProject)
                .WithConversion(descriptionTopDistanceValueConverter);

                bindingSet.Bind(ProjectTaskClientLabel)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasProject)
                .WithConversion(visibilityConverter);

                bindingSet.Apply();
            });
        }
コード例 #9
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            this.DelayBind(() =>
            {
                var checkboxImageConverter = new BoolToConstantValueConverter <UIImage>(
                    checkBoxCheckedImage, checkBoxUncheckedImage);

                var bindingSet = this.CreateBindingSet <SelectableTagViewCell, SelectableTagViewModel>();

                bindingSet.Bind(TagLabel).To(vm => vm.Name);

                bindingSet.Bind(SelectedImage)
                .To(vm => vm.Selected)
                .WithConversion(checkboxImageConverter);

                bindingSet.Apply();
            });
        }
コード例 #10
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();

            UIKeyboard.Notifications.ObserveWillShow(keyboardWillShow);
            UIKeyboard.Notifications.ObserveWillHide(keyboardWillHide);

            var source = new StartTimeEntryTableViewSource(SuggestionsTableView);

            SuggestionsTableView.Source = source;

            var timeSpanConverter    = new TimeSpanToDurationValueConverter();
            var buttonColorConverter = new BoolToConstantValueConverter <UIColor>(
                Color.StartTimeEntry.ActiveButton.ToNativeColor(),
                Color.StartTimeEntry.InactiveButton.ToNativeColor()
                );

            var bindingSet = this.CreateBindingSet <StartTimeEntryViewController, StartTimeEntryViewModel>();

            //TableView
            bindingSet.Bind(source).To(vm => vm.Suggestions);

            //Text
            bindingSet.Bind(TimeLabel).To(vm => vm.ElapsedTime).WithConversion(timeSpanConverter);
            bindingSet.Bind(DescriptionTextField).To(vm => vm.RawTimeEntryText);

            //Buttons
            bindingSet.Bind(BillableButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsBillable)
            .WithConversion(buttonColorConverter);

            //Commands
            bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand);
            bindingSet.Bind(CloseButton).To(vm => vm.BackCommand);
            bindingSet.Bind(BillableButton).To(vm => vm.ToggleBillableCommand);

            bindingSet.Apply();
        }
コード例 #11
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            this.DelayBind(() =>
            {
                var visibilityConverter = new MvxVisibilityValueConverter();
                var descriptionTopDistanceValueConverter = new BoolToConstantValueConverter <nfloat>(HasProjectDistance, NoProjectDistance);
                var projectTaskClientCombiner            = new ProjectTaskClientValueCombiner(
                    ProjectLabel.Font.CapHeight,
                    Color.Suggestions.ClientColor.ToNativeColor(),
                    true
                    );

                var bindingSet = this.CreateBindingSet <StartTimeEntryViewCell, TimeEntrySuggestion>();

                //Text
                bindingSet.Bind(DescriptionLabel).To(vm => vm.Description);

                bindingSet.Bind(ProjectLabel)
                .For(v => v.AttributedText)
                .ByCombining(projectTaskClientCombiner,
                             v => v.ProjectName,
                             v => v.TaskName,
                             v => v.ClientName,
                             v => v.ProjectColor);

                //Visibility
                bindingSet.Bind(DescriptionTopDistanceConstraint)
                .For(v => v.Constant)
                .To(vm => vm.HasProject)
                .WithConversion(descriptionTopDistanceValueConverter);

                bindingSet.Bind(ProjectLabel)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasProject)
                .WithConversion(visibilityConverter);

                bindingSet.Apply();
            });
        }
コード例 #12
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            TitleLabel.Font = Font;

            this.DelayBind(() =>
            {
                var backgroundColorConverter = new BoolToConstantValueConverter <UIColor>(
                    Color.Calendar.QuickSelect.SelectedBackground.ToNativeColor(),
                    Color.Calendar.QuickSelect.UnselectedBackground.ToNativeColor()
                    );
                var titleColorConverter = new BoolToConstantValueConverter <UIColor>(
                    Color.Calendar.QuickSelect.SelectedTitle.ToNativeColor(),
                    Color.Calendar.QuickSelect.UnselectedTitle.ToNativeColor()
                    );

                var bindingSet = this.CreateBindingSet <ReportsCalendarQuickSelectViewCell, CalendarBaseQuickSelectShortcut>();

                //Text
                bindingSet.Bind(TitleLabel).To(vm => vm.Title);

                //Color
                bindingSet.Bind(ContentView)
                .For(v => v.BackgroundColor)
                .To(vm => vm.Selected)
                .WithConversion(backgroundColorConverter);

                bindingSet.Bind(TitleLabel)
                .For(v => v.TextColor)
                .To(vm => vm.Selected)
                .WithConversion(titleColorConverter);

                bindingSet.Apply();
            });
        }
コード例 #13
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            Title = Resources.LoginTitle;

            prepareViews();

            var invertedBoolConverter = new BoolToConstantValueConverter <bool>(false, true);

            var bindingSet = this.CreateBindingSet <TokenResetViewController, TokenResetViewModel>();

            //Text
            bindingSet.Bind(ErrorLabel).To(vm => vm.Error);
            bindingSet.Bind(PasswordTextField)
            .For(v => v.BindSecureTextEntry())
            .To(vm => vm.IsPasswordMasked);

            bindingSet.Bind(EmailLabel)
            .To(vm => vm.Email)
            .WithConversion(new EmailToStringValueConverter());

            bindingSet.Bind(PasswordTextField)
            .To(vm => vm.Password)
            .WithConversion(new PasswordToStringValueConverter());

            //Commands
            bindingSet.Bind(SignOutButton).To(vm => vm.SignOutCommand);

            bindingSet.Bind(nextButton)
            .For(v => v.BindCommand())
            .To(vm => vm.DoneCommand);

            bindingSet.Bind(ShowPasswordButton)
            .For(v => v.BindTap())
            .To(vm => vm.TogglePasswordVisibilityCommand);

            //Enabled
            bindingSet.Bind(PasswordTextField)
            .For(v => v.BindShouldReturn())
            .To(vm => vm.DoneCommand);

            bindingSet.Bind(nextButton)
            .For(v => v.Enabled)
            .To(vm => vm.NextIsEnabled);

            //Visibility
            bindingSet.Bind(ErrorView)
            .For(v => v.BindVisible())
            .To(vm => vm.HasError);

            bindingSet.Bind(ShowPasswordButton)
            .For(v => v.BindVisibility())
            .To(vm => vm.IsLoading)
            .WithConversion(new MvxInvertedVisibilityValueConverter());

            bindingSet.Bind(ActivityIndicatorView)
            .For(v => v.BindVisible())
            .To(vm => vm.IsLoading);

            //State
            bindingSet.Apply();

            PasswordTextField.BecomeFirstResponder();
        }
コード例 #14
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();

            UIKeyboard.Notifications.ObserveWillShow(keyboardWillShow);
            UIKeyboard.Notifications.ObserveWillHide(keyboardWillHide);

            var source = new StartTimeEntryTableViewSource(SuggestionsTableView);

            SuggestionsTableView.Source = source;

            var timeSpanConverter    = new TimeSpanToDurationValueConverter();
            var buttonColorConverter = new BoolToConstantValueConverter <UIColor>(
                Color.StartTimeEntry.ActiveButton.ToNativeColor(),
                Color.StartTimeEntry.InactiveButton.ToNativeColor()
                );

            var bindingSet = this.CreateBindingSet <StartTimeEntryViewController, StartTimeEntryViewModel>();

            //TableView
            bindingSet.Bind(source).To(vm => vm.Suggestions);
            bindingSet.Bind(source)
            .For(v => v.ToggleTasksCommand)
            .To(vm => vm.ToggleTaskSuggestionsCommand);

            bindingSet.Bind(source)
            .For(v => v.UseGrouping)
            .To(vm => vm.UseGrouping);

            bindingSet.Bind(source)
            .For(v => v.SelectionChangedCommand)
            .To(vm => vm.SelectSuggestionCommand);

            //Text
            bindingSet.Bind(TimeLabel)
            .To(vm => vm.ElapsedTime)
            .WithConversion(timeSpanConverter);

            bindingSet.Bind(DescriptionTextView)
            .For(v => v.BindTextFieldInfo())
            .To(vm => vm.TextFieldInfo);

            //Buttons
            bindingSet.Bind(TagsButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsSuggestingTags)
            .WithConversion(buttonColorConverter);

            bindingSet.Bind(BillableButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsBillable)
            .WithConversion(buttonColorConverter);

            bindingSet.Bind(ProjectsButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsSuggestingProjects)
            .WithConversion(buttonColorConverter);

            bindingSet.Bind(DurationButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsEditingDuration)
            .WithConversion(buttonColorConverter);

            bindingSet.Bind(DateTimeButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsEditingStartDate)
            .WithConversion(buttonColorConverter);

            //Visibility
            bindingSet.Bind(BillableButtonWidthConstraint)
            .For(v => v.Constant)
            .To(vm => vm.IsBillableAvailable)
            .WithConversion(new BoolToConstantValueConverter <nfloat>(42, 0));

            //Commands
            bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand);
            bindingSet.Bind(CloseButton).To(vm => vm.BackCommand);
            bindingSet.Bind(DurationButton).To(vm => vm.ChangeDurationCommand);
            bindingSet.Bind(BillableButton).To(vm => vm.ToggleBillableCommand);
            bindingSet.Bind(DateTimeButton).To(vm => vm.ChangeStartTimeCommand);
            bindingSet.Bind(TagsButton).To(vm => vm.ToggleTagSuggestionsCommand);
            bindingSet.Bind(ProjectsButton).To(vm => vm.ToggleProjectSuggestionsCommand);

            bindingSet.Apply();
        }
コード例 #15
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            startTimeChangingSubscription = ViewModel.StartTimeChanging.Subscribe(startTimeChanging);

            prepareViews();

            var durationCombiner              = new DurationValueCombiner();
            var timeCombiner                  = new DateTimeOffsetTimeFormatValueCombiner(TimeZoneInfo.Local);
            var dateCombiner                  = new DateTimeOffsetDateFormatValueCombiner(TimeZoneInfo.Local, useLongFormat: false);
            var timeFormatToLocaleConverter   = new TimeFormatToLocaleValueConverter();
            var inverseBoolConverter          = new BoolToConstantValueConverter <bool>(false, true);
            var editedTimeLabelColorConverter = new BoolToConstantValueConverter <UIColor>(
                Color.EditDuration.EditedTime.ToNativeColor(),
                Color.EditDuration.NotEditedTime.ToNativeColor());

            var bindingSet = this.CreateBindingSet <EditDurationViewController, EditDurationViewModel>();

            //Commands
            bindingSet.Bind(SaveButton).To(vm => vm.SaveCommand);
            bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand);

            //Start and stop date/time
            bindingSet.Bind(StartTimeLabel)
            .ByCombining(timeCombiner,
                         vm => vm.StartTime,
                         vm => vm.TimeFormat);

            bindingSet.Bind(StartDateLabel)
            .ByCombining(dateCombiner,
                         vm => vm.StartTime,
                         vm => vm.DateFormat);

            bindingSet.Bind(EndTimeLabel)
            .ByCombining(timeCombiner,
                         vm => vm.StopTime,
                         vm => vm.TimeFormat);

            bindingSet.Bind(EndDateLabel)
            .ByCombining(dateCombiner,
                         vm => vm.StopTime,
                         vm => vm.DateFormat);

            //Editing start and end time
            bindingSet.Bind(StartView)
            .For(v => v.BindTap())
            .To(vm => vm.EditStartTimeCommand);

            bindingSet.Bind(EndView)
            .For(v => v.BindTap())
            .To(vm => vm.EditStopTimeCommand);

            bindingSet.Bind(SetEndButton)
            .For(v => v.BindVisibility())
            .To(vm => vm.IsRunning)
            .WithConversion(inverseBoolConverter);

            bindingSet.Bind(SetEndButton)
            .To(vm => vm.EditStopTimeCommand);

            //Visibility
            bindingSet.Bind(EndTimeLabel)
            .For(v => v.BindVisibility())
            .To(vm => vm.IsRunning);

            bindingSet.Bind(EndDateLabel)
            .For(v => v.BindVisibility())
            .To(vm => vm.IsRunning);

            //Stard and end colors
            bindingSet.Bind(StartTimeLabel)
            .For(v => v.TextColor)
            .To(vm => vm.IsEditingStartTime)
            .WithConversion(editedTimeLabelColorConverter);

            bindingSet.Bind(StartDateLabel)
            .For(v => v.TextColor)
            .To(vm => vm.IsEditingStartTime)
            .WithConversion(editedTimeLabelColorConverter);

            bindingSet.Bind(EndTimeLabel)
            .For(v => v.TextColor)
            .To(vm => vm.IsEditingStopTime)
            .WithConversion(editedTimeLabelColorConverter);

            bindingSet.Bind(EndDateLabel)
            .For(v => v.TextColor)
            .To(vm => vm.IsEditingStopTime)
            .WithConversion(editedTimeLabelColorConverter);

            //Date picker
            bindingSet.Bind(DatePickerContainer)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.IsEditingTime);

            bindingSet.Bind(DatePicker)
            .For(v => v.BindDateTimeOffset())
            .To(vm => vm.EditedTime);

            bindingSet.Bind(DatePicker)
            .For(v => v.MaximumDate)
            .To(vm => vm.MaximumDateTime);

            bindingSet.Bind(DatePicker)
            .For(v => v.MinimumDate)
            .To(vm => vm.MinimumDateTime);

            bindingSet.Bind(DatePicker)
            .For(v => v.Locale)
            .To(vm => vm.TimeFormat)
            .WithConversion(timeFormatToLocaleConverter);

            //The wheel
            bindingSet.Bind(DurationInput)
            .For(v => v.UserInteractionEnabled)
            .To(vm => vm.IsEditingTime)
            .WithConversion(inverseBoolConverter);

            bindingSet.Bind(DurationInput)
            .For(v => v.Duration)
            .To(vm => vm.Duration);

            bindingSet.Bind(DurationInput)
            .For(v => v.FormattedDuration)
            .ByCombining(durationCombiner,
                         vm => vm.Duration,
                         vm => vm.DurationFormat);

            bindingSet.Bind(WheelView)
            .For(v => v.UserInteractionEnabled)
            .To(vm => vm.IsEditingTime)
            .WithConversion(inverseBoolConverter);

            bindingSet.Bind(WheelView)
            .For(v => v.MaximumStartTime)
            .To(vm => vm.MaximumStartTime);

            bindingSet.Bind(WheelView)
            .For(v => v.MinimumStartTime)
            .To(vm => vm.MinimumStartTime);

            bindingSet.Bind(WheelView)
            .For(v => v.MaximumEndTime)
            .To(vm => vm.MaximumStopTime);

            bindingSet.Bind(WheelView)
            .For(v => v.MinimumEndTime)
            .To(vm => vm.MinimumStopTime);

            bindingSet.Bind(WheelView)
            .For(v => v.StartTime)
            .To(vm => vm.StartTime);

            bindingSet.Bind(WheelView)
            .For(v => v.EndTime)
            .To(vm => vm.StopTime);

            bindingSet.Bind(WheelView)
            .For(v => v.IsRunning)
            .To(vm => vm.IsRunning);

            bindingSet.Apply();

            // Interaction observables for analytics

            var editingStart = Observable.Merge(
                StartView.Rx().Tap().Select(true),
                EndView.Rx().Tap().Select(false)
                );

            var dateComponentChanged = DatePicker.Rx().DateComponent()
                                       .WithLatestFrom(editingStart,
                                                       (_, isStart) => isStart ? EditTimeSource.BarrelStartDate : EditTimeSource.BarrelStopDate
                                                       );

            var timeComponentChanged = DatePicker.Rx().TimeComponent()
                                       .WithLatestFrom(editingStart,
                                                       (_, isStart) => isStart ? EditTimeSource.BarrelStartTime : EditTimeSource.BarrelStopTime
                                                       );

            var durationInputChanged = Observable
                                       .FromEventPattern(e => DurationInput.DurationChanged += e, e => DurationInput.DurationChanged -= e)
                                       .Select(EditTimeSource.NumpadDuration);

            Observable.Merge(
                dateComponentChanged,
                timeComponentChanged,
                WheelView.TimeEdited,
                durationInputChanged
                )
            .Distinct()
            .Subscribe(ViewModel.TimeEditedWithSource)
            .DisposedBy(disposeBag);
        }
コード例 #16
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            FadeView.FadeRight = true;

            TimeLabel.Font = TimeLabel.Font.GetMonospacedDigitFont();
            ContinueButton.TouchUpInside += onContinueButtonTap;

            this.DelayBind(() =>
            {
                var colorConverter              = new MvxRGBValueConverter();
                var visibilityConverter         = new MvxVisibilityValueConverter();
                var timeSpanConverter           = new TimeSpanToDurationValueConverter();
                var invertedVisibilityConverter = new MvxInvertedVisibilityValueConverter();
                var projectTaskClientCombiner   = new ProjectTaskClientValueCombiner(
                    ProjectTaskClientLabel.Font.CapHeight,
                    Color.TimeEntriesLog.ClientColor.ToNativeColor(),
                    true
                    );
                var descriptionTopDistanceValueConverter =
                    new BoolToConstantValueConverter <nfloat>(hasProjectDistance, noProjectDistance);

                var bindingSet = this.CreateBindingSet <TimeEntriesLogViewCell, TimeEntryViewModel>();

                //Text
                bindingSet.Bind(DescriptionLabel).To(vm => vm.Description);
                bindingSet.Bind(ProjectTaskClientLabel)
                .For(v => v.AttributedText)
                .ByCombining(projectTaskClientCombiner,
                             v => v.ProjectName,
                             v => v.TaskName,
                             v => v.ClientName,
                             v => v.ProjectColor);

                bindingSet.Bind(TimeLabel)
                .To(vm => vm.Duration)
                .WithConversion(timeSpanConverter);

                //Visibility
                bindingSet.Bind(DescriptionTopDistanceConstraint)
                .For(v => v.Constant)
                .To(vm => vm.HasProject)
                .WithConversion(descriptionTopDistanceValueConverter);

                bindingSet.Bind(ProjectTaskClientLabel)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasProject)
                .WithConversion(visibilityConverter);

                bindingSet.Bind(AddDescriptionLabel)
                .For(v => v.BindVisibility())
                .To(vm => vm.HasDescription)
                .WithConversion(invertedVisibilityConverter);

                bindingSet.Bind(AddDescriptionTopDistanceConstraint)
                .For(v => v.Constant)
                .To(vm => vm.HasProject)
                .WithConversion(descriptionTopDistanceValueConverter);

                bindingSet.Bind(SyncErrorImageView)
                .For(v => v.BindVisibility())
                .To(vm => vm.CanSync)
                .WithConversion(invertedVisibilityConverter);

                bindingSet.Bind(UnsyncedImageView)
                .For(v => v.BindVisibility())
                .To(vm => vm.NeedsSync)
                .WithConversion(visibilityConverter);

                bindingSet.Bind(ContinueButton)
                .For(v => v.BindVisibility())
                .To(vm => vm.CanSync)
                .WithConversion(visibilityConverter);

                bindingSet.Bind(ContinueImageView)
                .For(v => v.BindVisibility())
                .To(vm => vm.CanSync)
                .WithConversion(visibilityConverter);

                bindingSet.Apply();
            });
        }
コード例 #17
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            var templateImage = TotalDurationGraph.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate);

            TotalDurationGraph.Image = templateImage;

            prepareViews();

            var colorConverter = new BoolToConstantValueConverter <UIColor>(
                Color.Reports.Disabled.ToNativeColor(),
                Color.Reports.TotalTimeActivated.ToNativeColor()
                );

            var durationCombiner = new DurationValueCombiner();

            this.DelayBind(() =>
            {
                var bindingSet = this.CreateBindingSet <ReportsHeaderView, ReportsViewModel>();

                //Text
                bindingSet.Bind(BillablePercentageLabel)
                .For(v => v.AttributedText)
                .To(vm => vm.BillablePercentage)
                .WithConversion(new ReportPercentageLabelValueConverter());

                bindingSet.Bind(TotalDurationLabel)
                .For(v => v.Text)
                .ByCombining(durationCombiner,
                             vm => vm.TotalTime,
                             vm => vm.DurationFormat);

                //Loading chart
                bindingSet.Bind(LoadingPieChartView)
                .For(v => v.BindVisibilityWithFade())
                .To(vm => vm.IsLoading);

                bindingSet.Bind(LoadingCardView)
                .For(v => v.BindVisibilityWithFade())
                .To(vm => vm.IsLoading);

                //Pretty stuff
                bindingSet.Bind(PieChartView)
                .For(v => v.Segments)
                .To(vm => vm.GroupedSegments);

                bindingSet.Bind(BillablePercentageView)
                .For(v => v.Percentage)
                .To(vm => vm.BillablePercentage);

                bindingSet.Bind(TotalDurationGraph)
                .For(v => v.TintColor)
                .To(vm => vm.TotalTimeIsZero)
                .WithConversion(colorConverter);

                bindingSet.Bind(TotalDurationLabel)
                .For(v => v.TextColor)
                .To(vm => vm.TotalTimeIsZero)
                .WithConversion(colorConverter);

                // Bar chart

                if (ViewModel == null)
                {
                    throw new InvalidOperationException($"The {nameof(ViewModel)} value must be set for {nameof(ReportsHeaderView)} before defining bindings.");
                }

                ViewModel.WorkspaceHasBillableFeatureEnabled
                .Subscribe(ColorsLegendContainerView.Rx().IsVisible())
                .DisposedBy(disposeBag);

                ViewModel.StartDate
                .CombineLatest(
                    ViewModel.BarChartViewModel.DateFormat,
                    (startDate, format) => startDate.ToString(format.Short))
                .Subscribe(StartDateLabel.Rx().Text())
                .DisposedBy(disposeBag);

                ViewModel.EndDate
                .CombineLatest(
                    ViewModel.BarChartViewModel.DateFormat,
                    (endDate, format) => endDate.ToString(format.Short))
                .Subscribe(EndDateLabel.Rx().Text())
                .DisposedBy(disposeBag);

                ViewModel.BarChartViewModel.MaximumHoursPerBar
                .Select(hours => $"{hours} h")
                .Subscribe(MaximumHoursLabel.Rx().Text())
                .DisposedBy(disposeBag);

                ViewModel.BarChartViewModel.MaximumHoursPerBar
                .Select(hours => $"{hours/2} h")
                .Subscribe(HalfHoursLabel.Rx().Text())
                .DisposedBy(disposeBag);

                ViewModel.BarChartViewModel.HorizontalLegend
                .Where(legend => legend == null)
                .Subscribe((DateTimeOffset[] _) =>
                {
                    HorizontalLegendStackView.Subviews.ForEach(subview => subview.RemoveFromSuperview());
                    StartDateLabel.Hidden = false;
                    EndDateLabel.Hidden   = false;
                })
                .DisposedBy(disposeBag);

                ViewModel.BarChartViewModel.HorizontalLegend
                .Where(legend => legend != null)
                .CombineLatest(ViewModel.BarChartViewModel.DateFormat, createHorizontalLegendLabels)
                .Do(_ =>
                {
                    StartDateLabel.Hidden = true;
                    EndDateLabel.Hidden   = true;
                })
                .Subscribe(HorizontalLegendStackView.Rx().ArrangedViews())
                .DisposedBy(disposeBag);

                ViewModel.BarChartViewModel.Bars
                .Select(createBarViews)
                .Subscribe(BarsStackView.Rx().ArrangedViews())
                .DisposedBy(disposeBag);

                var spacingObservable = ViewModel.BarChartViewModel.Bars
                                        .CombineLatest(updateLayout, (bars, _) => bars)
                                        .Select(bars => BarsStackView.Frame.Width / bars.Length * barChartSpacingProportion);

                spacingObservable
                .Subscribe(BarsStackView.Rx().Spacing())
                .DisposedBy(disposeBag);

                spacingObservable
                .Subscribe(HorizontalLegendStackView.Rx().Spacing())
                .DisposedBy(disposeBag);

                ViewModel.IsLoadingObservable
                .Select(CommonFunctions.Invert)
                .Subscribe(BarChartContainerView.Rx().IsVisible())
                .DisposedBy(disposeBag);

                //Visibility
                bindingSet.Bind(EmptyStateView)
                .For(v => v.BindVisible())
                .To(vm => vm.ShowEmptyState);

                bindingSet.Apply();
            });
        }
コード例 #18
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var loginButtonColorConverter = new BoolToConstantValueConverter <UIColor>(UIColor.White, UIColor.Black);
            var loginButtonTitleConverter = new BoolToConstantValueConverter <string>("", Resources.LoginTitle);
            var invertedBoolConverter     = new BoolToConstantValueConverter <bool>(false, true);

            var bindingSet = this.CreateBindingSet <LoginViewController, NewLoginViewModel>();

            //Text
            bindingSet.Bind(ErrorLabel).To(vm => vm.ErrorMessage);
            bindingSet.Bind(EmailTextField)
            .To(vm => vm.Email)
            .WithConversion(new EmailToStringValueConverter());

            bindingSet.Bind(PasswordTextField)
            .To(vm => vm.Password)
            .WithConversion(new PasswordToStringValueConverter());

            bindingSet.Bind(LoginButton)
            .For(v => v.BindAnimatedTitle())
            .To(vm => vm.IsLoading)
            .WithConversion(loginButtonTitleConverter);

            //Commands
            bindingSet.Bind(LoginButton).To(vm => vm.LoginCommand);
            bindingSet.Bind(GoogleLoginButton).To(vm => vm.GoogleLoginCommand);
            bindingSet.Bind(ForgotPasswordButton).To(vm => vm.ForgotPasswordCommand);
            bindingSet.Bind(PasswordManagerButton).To(vm => vm.StartPasswordManagerCommand);
            bindingSet.Bind(ShowPasswordButton).To(vm => vm.TogglePasswordVisibilityCommand);

            bindingSet.Bind(SignupCard)
            .For(v => v.BindTap())
            .To(vm => vm.SignupCommand);

            //Visibilty
            bindingSet.Bind(ErrorLabel)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.HasError);

            bindingSet.Bind(ActivityIndicator)
            .For(v => v.BindVisibilityWithFade())
            .To(vm => vm.IsLoading);

            bindingSet.Bind(PasswordManagerButton)
            .For(v => v.BindVisible())
            .To(vm => vm.IsPasswordManagerAvailable);

            bindingSet.Bind(PasswordTextField)
            .For(v => v.BindSecureTextEntry())
            .To(vm => vm.IsPasswordMasked);

            bindingSet.Bind(ShowPasswordButton)
            .For(v => v.BindVisible())
            .To(vm => vm.IsShowPasswordButtonVisible);

            bindingSet.Bind(PasswordTextField)
            .For(v => v.BindFirstResponder())
            .To(vm => vm.IsShowPasswordButtonVisible)
            .Mode(MvxBindingMode.OneWayToSource);
            //Color
            bindingSet.Bind(LoginButton)
            .For(v => v.TintColor)
            .To(vm => vm.HasError)
            .WithConversion(loginButtonColorConverter);

            bindingSet.Apply();

            prepareViews();
        }
コード例 #19
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();

            Title = ViewModel.Title;

            var inverseBoolConverter = new BoolToConstantValueConverter <bool>(false, true);
            var visibilityConverter  = new MvxVisibilityValueConverter();

            var bindingSet = this.CreateBindingSet <SettingsViewController, SettingsViewModel>();

            // Text
            bindingSet.Bind(EmailLabel).To(vm => vm.Email);
            bindingSet.Bind(VersionLabel).To(vm => vm.Version);
            bindingSet.Bind(PlanLabel).To(vm => vm.CurrentPlan);
            bindingSet.Bind(WorkspaceLabel).To(vm => vm.WorkspaceName);

            // Commands
            bindingSet.Bind(LogoutButton).To(vm => vm.LogoutCommand);
            bindingSet.Bind(EmailView)
            .For(v => v.BindTap())
            .To(vm => vm.EditProfileCommand);

            bindingSet.Bind(WorkspaceView)
            .For(v => v.BindTap())
            .To(vm => vm.EditWorkspaceCommand);

            bindingSet.Bind(SubscriptionView)
            .For(v => v.BindTap())
            .To(vm => vm.EditSubscriptionCommand);

            bindingSet.Bind(TwentyFourHourClockView)
            .For(v => v.BindTap())
            .To(vm => vm.ToggleUseTwentyFourHourClockCommand);

            bindingSet.Bind(AddMobileTagView)
            .For(v => v.BindTap())
            .To(vm => vm.ToggleAddMobileTagCommand);

            bindingSet.Bind(FeedbackView)
            .For(v => v.BindTap())
            .To(vm => vm.SubmitFeedbackCommand);

            bindingSet.Bind(RateView)
            .For(v => v.BindTap())
            .To(vm => vm.RateCommand);

            bindingSet.Bind(UpdateView)
            .For(v => v.BindTap())
            .To(vm => vm.UpdateCommand);

            bindingSet.Bind(HelpView)
            .For(v => v.BindTap())
            .To(vm => vm.HelpCommand);

            // Logout process
            bindingSet.Bind(LogoutButton)
            .For(btn => btn.Enabled)
            .To(vm => vm.IsLoggingOut)
            .WithConversion(inverseBoolConverter);

            bindingSet.Bind(NavigationItem)
            .For(nav => nav.BindHidesBackButton())
            .To(vm => vm.IsLoggingOut);

            bindingSet.Bind(SyncingView)
            .For(view => view.BindVisibility())
            .To(vm => vm.IsRunningSync)
            .WithConversion(visibilityConverter);

            bindingSet.Bind(SyncedView)
            .For(view => view.BindVisibility())
            .To(vm => vm.IsSynced)
            .WithConversion(visibilityConverter);

            bindingSet.Bind(LoggingOutView)
            .For(view => view.BindVisibility())
            .To(vm => vm.IsLoggingOut)
            .WithConversion(visibilityConverter);

            // Switches
            bindingSet.Bind(AddMobileTagSwitch)
            .For(v => v.BindAnimatedOn())
            .To(vm => vm.AddMobileTag);

            bindingSet.Bind(TwentyFourHourClockSwitch)
            .For(v => v.BindAnimatedOn())
            .To(vm => vm.UseTwentyFourHourClock);

            bindingSet.Apply();
        }
コード例 #20
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            AddProjectBubbleLabel.Text = Resources.AddProjectBubbleText;

            prepareViews();
            prepareOnboarding();

            var source = new StartTimeEntryTableViewSource(SuggestionsTableView);

            SuggestionsTableView.Source = source;
            source.ToggleTasksCommand   = new MvxCommand <ProjectSuggestion>(toggleTaskSuggestions);

            var invertedVisibilityConverter = new MvxInvertedVisibilityValueConverter();
            var invertedBoolConverter       = new BoolToConstantValueConverter <bool>(false, true);
            var buttonColorConverter        = new BoolToConstantValueConverter <UIColor>(
                Color.StartTimeEntry.ActiveButton.ToNativeColor(),
                Color.StartTimeEntry.InactiveButton.ToNativeColor()
                );
            var durationCombiner = new DurationValueCombiner();

            var bindingSet = this.CreateBindingSet <StartTimeEntryViewController, StartTimeEntryViewModel>();

            //TableView
            bindingSet.Bind(source)
            .For(v => v.ObservableCollection)
            .To(vm => vm.Suggestions);

            bindingSet.Bind(source)
            .For(v => v.UseGrouping)
            .To(vm => vm.UseGrouping);

            bindingSet.Bind(source)
            .For(v => v.SelectSuggestionCommand)
            .To(vm => vm.SelectSuggestionCommand);

            bindingSet.Bind(source)
            .For(v => v.CreateCommand)
            .To(vm => vm.CreateCommand);

            bindingSet.Bind(source)
            .For(v => v.IsSuggestingProjects)
            .To(vm => vm.IsSuggestingProjects);

            bindingSet.Bind(source)
            .For(v => v.Text)
            .To(vm => vm.CurrentQuery);

            bindingSet.Bind(source)
            .For(v => v.SuggestCreation)
            .To(vm => vm.SuggestCreation);

            bindingSet.Bind(source)
            .For(v => v.ShouldShowNoTagsInfoMessage)
            .To(vm => vm.ShouldShowNoTagsInfoMessage);

            bindingSet.Bind(source)
            .For(v => v.ShouldShowNoProjectsInfoMessage)
            .To(vm => vm.ShouldShowNoProjectsInfoMessage);

            //Text
            bindingSet.Bind(TimeInput)
            .For(v => v.Duration)
            .To(vm => vm.DisplayedTime)
            .Mode(MvxBindingMode.OneWayToSource);

            bindingSet.Bind(TimeLabel)
            .For(v => v.Text)
            .ByCombining(durationCombiner,
                         vm => vm.DisplayedTime,
                         vm => vm.DisplayedTimeFormat);

            bindingSet.Bind(Placeholder)
            .To(vm => vm.PlaceholderText);

            //Buttons
            bindingSet.Bind(TagsButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsSuggestingTags)
            .WithConversion(buttonColorConverter);

            bindingSet.Bind(BillableButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsBillable)
            .WithConversion(buttonColorConverter);

            bindingSet.Bind(ProjectsButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsSuggestingProjects)
            .WithConversion(buttonColorConverter);

            //Visibility
            bindingSet.Bind(BillableButtonWidthConstraint)
            .For(v => v.Constant)
            .To(vm => vm.IsBillableAvailable)
            .WithConversion(new BoolToConstantValueConverter <nfloat>(42, 0));

            //Commands
            bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand);
            bindingSet.Bind(CloseButton).To(vm => vm.BackCommand);
            bindingSet.Bind(BillableButton).To(vm => vm.ToggleBillableCommand);
            bindingSet.Bind(StartDateButton).To(vm => vm.SetStartDateCommand);
            bindingSet.Bind(DateTimeButton).To(vm => vm.ChangeTimeCommand);
            bindingSet.Bind(TagsButton).To(vm => vm.ToggleTagSuggestionsCommand);
            bindingSet.Bind(ProjectsButton).To(vm => vm.ToggleProjectSuggestionsCommand);

            bindingSet.Apply();

            // Reactive
            ViewModel.TextFieldInfoObservable
            .Subscribe(onTextFieldInfo)
            .DisposedBy(DisposeBag);

            DescriptionTextView.Rx().AttributedText()
            .Select(attributedString => attributedString.Length == 0)
            .Subscribe(isDescriptionEmptySubject)
            .DisposedBy(DisposeBag);

            DescriptionTextView.Rx().AttributedText()
            .CombineLatest(DescriptionTextView.Rx().CursorPosition(), (text, _) => text)
            .Where(_ => !isUpdatingDescriptionField)
            .SubscribeOn(ThreadPoolScheduler.Instance)
            .Do(updatePlaceholder)
            .Select(text => text.AsImmutableSpans((int)DescriptionTextView.SelectedRange.Location))
            .ObserveOn(SynchronizationContext.Current)
            .Subscribe(async info => await ViewModel.OnTextFieldInfoFromView(info))
            .DisposedBy(DisposeBag);

            source.TableRenderCallback = () =>
            {
                ViewModel.StopSuggestionsRenderingStopwatch();
            };
        }
コード例 #21
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            startTimeChangingSubscription = ViewModel.StartTimeChanging.Subscribe(startTimeChanging);

            setupDismissingByTappingOnBackground();
            prepareViews();

            var durationCombiner              = new DurationValueCombiner();
            var timeCombiner                  = new DateTimeOffsetTimeFormatValueCombiner(TimeZoneInfo.Local);
            var dateCombiner                  = new DateTimeOffsetDateFormatValueCombiner(TimeZoneInfo.Local, useLongFormat: false);
            var timeFormatToLocaleConverter   = new TimeFormatToLocaleValueConverter();
            var inverseBoolConverter          = new BoolToConstantValueConverter <bool>(false, true);
            var editedTimeLabelColorConverter = new BoolToConstantValueConverter <UIColor>(
                Color.EditDuration.EditedTime.ToNativeColor(),
                Color.EditDuration.NotEditedTime.ToNativeColor());

            var bindingSet = this.CreateBindingSet <EditDurationViewController, EditDurationViewModel>();

            //Commands
            bindingSet.Bind(SaveButton).To(vm => vm.SaveCommand);
            bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand);

            //Start and stop date/time
            bindingSet.Bind(StartTimeLabel)
            .ByCombining(timeCombiner,
                         vm => vm.StartTime,
                         vm => vm.TimeFormat);

            bindingSet.Bind(StartDateLabel)
            .ByCombining(dateCombiner,
                         vm => vm.StartTime,
                         vm => vm.DateFormat);

            bindingSet.Bind(EndTimeLabel)
            .ByCombining(timeCombiner,
                         vm => vm.StopTime,
                         vm => vm.TimeFormat);

            bindingSet.Bind(EndDateLabel)
            .ByCombining(dateCombiner,
                         vm => vm.StopTime,
                         vm => vm.DateFormat);

            //Editing start and end time
            bindingSet.Bind(StartView)
            .For(v => v.BindTap())
            .To(vm => vm.EditStartTimeCommand);

            bindingSet.Bind(EndView)
            .For(v => v.BindTap())
            .To(vm => vm.EditStopTimeCommand);

            bindingSet.Bind(SetEndButton)
            .For(v => v.BindVisibility())
            .To(vm => vm.IsRunning)
            .WithConversion(inverseBoolConverter);

            bindingSet.Bind(SetEndButton)
            .To(vm => vm.EditStopTimeCommand);

            //Visiblity
            bindingSet.Bind(EndTimeLabel)
            .For(v => v.BindVisibility())
            .To(vm => vm.IsRunning);

            bindingSet.Bind(EndDateLabel)
            .For(v => v.BindVisibility())
            .To(vm => vm.IsRunning);

            //Stard and end colors
            bindingSet.Bind(StartTimeLabel)
            .For(v => v.TextColor)
            .To(vm => vm.IsEditingStartTime)
            .WithConversion(editedTimeLabelColorConverter);

            bindingSet.Bind(StartDateLabel)
            .For(v => v.TextColor)
            .To(vm => vm.IsEditingStartTime)
            .WithConversion(editedTimeLabelColorConverter);

            bindingSet.Bind(EndTimeLabel)
            .For(v => v.TextColor)
            .To(vm => vm.IsEditingStopTime)
            .WithConversion(editedTimeLabelColorConverter);

            bindingSet.Bind(EndDateLabel)
            .For(v => v.TextColor)
            .To(vm => vm.IsEditingStopTime)
            .WithConversion(editedTimeLabelColorConverter);

            //Date picker
            bindingSet.Bind(DatePickerContainer)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.IsEditingTime);

            bindingSet.Bind(DatePicker)
            .For(v => v.BindDateTimeOffset())
            .To(vm => vm.EditedTime);

            bindingSet.Bind(DatePicker)
            .For(v => v.MaximumDate)
            .To(vm => vm.MaximumDateTime);

            bindingSet.Bind(DatePicker)
            .For(v => v.MinimumDate)
            .To(vm => vm.MinimumDateTime);

            bindingSet.Bind(DatePicker)
            .For(v => v.Locale)
            .To(vm => vm.TimeFormat)
            .WithConversion(timeFormatToLocaleConverter);

            //The wheel
            bindingSet.Bind(DurationInput)
            .For(v => v.UserInteractionEnabled)
            .To(vm => vm.IsEditingTime)
            .WithConversion(inverseBoolConverter);

            bindingSet.Bind(DurationInput)
            .For(v => v.Duration)
            .To(vm => vm.Duration);

            bindingSet.Bind(DurationInput)
            .For(v => v.FormattedDuration)
            .ByCombining(durationCombiner,
                         vm => vm.Duration,
                         vm => vm.DurationFormat);

            bindingSet.Bind(WheelView)
            .For(v => v.UserInteractionEnabled)
            .To(vm => vm.IsEditingTime)
            .WithConversion(inverseBoolConverter);

            bindingSet.Bind(WheelView)
            .For(v => v.MaximumStartTime)
            .To(vm => vm.MaximumStartTime);

            bindingSet.Bind(WheelView)
            .For(v => v.MinimumStartTime)
            .To(vm => vm.MinimumStartTime);

            bindingSet.Bind(WheelView)
            .For(v => v.MaximumEndTime)
            .To(vm => vm.MaximumStopTime);

            bindingSet.Bind(WheelView)
            .For(v => v.MinimumEndTime)
            .To(vm => vm.MinimumStopTime);

            bindingSet.Bind(WheelView)
            .For(v => v.StartTime)
            .To(vm => vm.StartTime);

            bindingSet.Bind(WheelView)
            .For(v => v.EndTime)
            .To(vm => vm.StopTime);

            bindingSet.Bind(WheelView)
            .For(v => v.IsRunning)
            .To(vm => vm.IsRunning);

            bindingSet.Apply();
        }
コード例 #22
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();
            prepareOnboarding();

            var source = new StartTimeEntryTableViewSource(SuggestionsTableView);

            SuggestionsTableView.Source = source;
            source.ToggleTasksCommand   = new MvxCommand <ProjectSuggestion>(toggleTaskSuggestions);

            var parametricDurationConverter = new ParametricTimeSpanToDurationValueConverter();
            var invertedVisibilityConverter = new MvxInvertedVisibilityValueConverter();
            var invertedBoolConverter       = new BoolToConstantValueConverter <bool>(false, true);
            var buttonColorConverter        = new BoolToConstantValueConverter <UIColor>(
                Color.StartTimeEntry.ActiveButton.ToNativeColor(),
                Color.StartTimeEntry.InactiveButton.ToNativeColor()
                );

            var bindingSet = this.CreateBindingSet <StartTimeEntryViewController, StartTimeEntryViewModel>();

            //TableView
            bindingSet.Bind(source)
            .For(v => v.ObservableCollection)
            .To(vm => vm.Suggestions);

            bindingSet.Bind(source)
            .For(v => v.UseGrouping)
            .To(vm => vm.UseGrouping);

            bindingSet.Bind(source)
            .For(v => v.SelectSuggestionCommand)
            .To(vm => vm.SelectSuggestionCommand);

            bindingSet.Bind(source)
            .For(v => v.CreateCommand)
            .To(vm => vm.CreateCommand);

            bindingSet.Bind(source)
            .For(v => v.IsSuggestingProjects)
            .To(vm => vm.IsSuggestingProjects);

            bindingSet.Bind(source)
            .For(v => v.Text)
            .To(vm => vm.CurrentQuery);

            bindingSet.Bind(source)
            .For(v => v.SuggestCreation)
            .To(vm => vm.SuggestCreation);

            bindingSet.Bind(source)
            .For(v => v.ShouldShowNoTagsInfoMessage)
            .To(vm => vm.ShouldShowNoTagsInfoMessage);

            bindingSet.Bind(source)
            .For(v => v.ShouldShowNoProjectsInfoMessage)
            .To(vm => vm.ShouldShowNoProjectsInfoMessage);

            //Text
            bindingSet.Bind(TimeInput)
            .For(v => v.Duration)
            .To(vm => vm.DisplayedTime);

            bindingSet.Bind(DescriptionTextView)
            .For(v => v.BindTextFieldInfo())
            .To(vm => vm.TextFieldInfo);

            bindingSet.Bind(TimeInput)
            .For(v => v.FormattedDuration)
            .To(vm => vm.DisplayedTime)
            .WithConversion(parametricDurationConverter, DurationFormat.Improved);

            bindingSet.Bind(Placeholder)
            .To(vm => vm.PlaceholderText);

            bindingSet.Bind(DescriptionRemainingLengthLabel)
            .To(vm => vm.DescriptionRemainingBytes);

            //Buttons
            bindingSet.Bind(TagsButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsSuggestingTags)
            .WithConversion(buttonColorConverter);

            bindingSet.Bind(BillableButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsBillable)
            .WithConversion(buttonColorConverter);

            bindingSet.Bind(ProjectsButton)
            .For(v => v.TintColor)
            .To(vm => vm.IsSuggestingProjects)
            .WithConversion(buttonColorConverter);

            bindingSet.Bind(DoneButton)
            .For(v => v.Enabled)
            .To(vm => vm.DescriptionLengthExceeded)
            .WithConversion(invertedBoolConverter);

            //Visibility
            bindingSet.Bind(BillableButtonWidthConstraint)
            .For(v => v.Constant)
            .To(vm => vm.IsBillableAvailable)
            .WithConversion(new BoolToConstantValueConverter <nfloat>(42, 0));

            bindingSet.Bind(DescriptionRemainingLengthLabel)
            .For(v => v.BindVisible())
            .To(vm => vm.DescriptionLengthExceeded)
            .WithConversion(invertedVisibilityConverter);

            //Commands
            bindingSet.Bind(DoneButton).To(vm => vm.DoneCommand);
            bindingSet.Bind(CloseButton).To(vm => vm.BackCommand);
            bindingSet.Bind(BillableButton).To(vm => vm.ToggleBillableCommand);
            bindingSet.Bind(StartDateButton).To(vm => vm.SetStartDateCommand);
            bindingSet.Bind(DateTimeButton).To(vm => vm.ChangeTimeCommand);
            bindingSet.Bind(TagsButton).To(vm => vm.ToggleTagSuggestionsCommand);
            bindingSet.Bind(ProjectsButton).To(vm => vm.ToggleProjectSuggestionsCommand);

            bindingSet.Apply();
        }
コード例 #23
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            setupDismissingByTappingOnBackground();
            prepareViews();

            var durationCombiner            = new DurationValueCombiner();
            var dateCombiner                = new DateTimeOffsetDateFormatValueCombiner(TimeZoneInfo.Local);
            var timeCombiner                = new DateTimeOffsetTimeFormatValueCombiner(TimeZoneInfo.Local);
            var visibilityConverter         = new MvxVisibilityValueConverter();
            var invertedBoolConverter       = new BoolToConstantValueConverter <bool>(false, true);
            var inverterVisibilityConverter = new MvxInvertedVisibilityValueConverter();
            var projectTaskClientCombiner   = new ProjectTaskClientValueCombiner(
                ProjectTaskClientLabel.Font.CapHeight,
                Color.EditTimeEntry.ClientText.ToNativeColor(),
                false
                );
            var stopRunningTimeEntryAndEditDurationForStoppedConverter = new BoolToConstantValueConverter <IMvxCommand>(
                ViewModel.StopCommand, ViewModel.EditDurationCommand);

            var bindingSet = this.CreateBindingSet <EditTimeEntryViewController, EditTimeEntryViewModel>();

            //Error message view
            bindingSet.Bind(ErrorMessageLabel)
            .For(v => v.Text)
            .To(vm => vm.SyncErrorMessage);

            bindingSet.Bind(ErrorView)
            .For(v => v.BindTap())
            .To(vm => vm.DismissSyncErrorMessageCommand);

            bindingSet.Bind(ErrorView)
            .For(v => v.BindVisible())
            .To(vm => vm.SyncErrorMessageVisible)
            .WithConversion(inverterVisibilityConverter);

            //Text
            bindingSet.Bind(DescriptionTextView)
            .For(v => v.RemainingLength)
            .To(vm => vm.DescriptionRemainingLength);

            bindingSet.Bind(DescriptionTextView)
            .For(v => v.BindText())
            .To(vm => vm.Description);

            bindingSet.Bind(BillableSwitch)
            .For(v => v.BindAnimatedOn())
            .To(vm => vm.Billable);

            bindingSet.Bind(DurationLabel)
            .ByCombining(durationCombiner,
                         vm => vm.Duration,
                         vm => vm.DurationFormat);

            bindingSet.Bind(ProjectTaskClientLabel)
            .For(v => v.AttributedText)
            .ByCombining(projectTaskClientCombiner,
                         v => v.Project,
                         v => v.Task,
                         v => v.Client,
                         v => v.ProjectColor);

            bindingSet.Bind(StartDateLabel)
            .ByCombining(dateCombiner,
                         vm => vm.StartTime,
                         vm => vm.DateFormat);

            bindingSet.Bind(StartTimeLabel)
            .ByCombining(timeCombiner,
                         vm => vm.StartTime,
                         vm => vm.TimeFormat);

            bindingSet.Bind(EndTimeLabel)
            .ByCombining(timeCombiner,
                         vm => vm.StopTime,
                         vm => vm.TimeFormat);

            //Commands
            bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand);
            bindingSet.Bind(DeleteButton).To(vm => vm.DeleteCommand);
            bindingSet.Bind(ConfirmButton).To(vm => vm.ConfirmCommand);

            bindingSet.Bind(DurationView)
            .For(v => v.BindTap())
            .To(vm => vm.EditDurationCommand);

            bindingSet.Bind(StartTimeView)
            .For(v => v.BindTap())
            .To(vm => vm.EditDurationCommand);

            bindingSet.Bind(StopButton)
            .To(vm => vm.StopCommand);

            bindingSet.Bind(EndTimeView)
            .For(v => v.BindTap())
            .To(vm => vm.IsTimeEntryRunning)
            .WithConversion(stopRunningTimeEntryAndEditDurationForStoppedConverter);

            bindingSet.Bind(ProjectTaskClientLabel)
            .For(v => v.BindTap())
            .To(vm => vm.SelectProjectCommand);

            bindingSet.Bind(AddProjectAndTaskView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectProjectCommand);

            bindingSet.Bind(StartDateView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectStartDateCommand);

            bindingSet.Bind(TagsTextView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectTagsCommand);

            bindingSet.Bind(AddTagsView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectTagsCommand);

            bindingSet.Bind(BillableView)
            .For(v => v.BindTap())
            .To(vm => vm.ToggleBillableCommand);

            //End time and the stop button visibility
            bindingSet.Bind(StopButton)
            .For(v => v.BindVisible())
            .To(vm => vm.IsTimeEntryRunning)
            .WithConversion(inverterVisibilityConverter);

            bindingSet.Bind(EndTimeLabel)
            .For(v => v.BindVisible())
            .To(vm => vm.IsTimeEntryRunning)
            .WithConversion(visibilityConverter);

            //Project visibility
            bindingSet.Bind(AddProjectAndTaskView)
            .For(v => v.BindVisible())
            .To(vm => vm.Project)
            .WithConversion(visibilityConverter);

            bindingSet.Bind(ProjectTaskClientLabel)
            .For(v => v.BindVisible())
            .To(vm => vm.Project)
            .WithConversion(inverterVisibilityConverter);

            //Tags visibility
            bindingSet.Bind(AddTagsView)
            .For(v => v.BindVisible())
            .To(vm => vm.HasTags)
            .WithConversion(visibilityConverter);

            bindingSet.Bind(TagsTextView)
            .For(v => v.BindVisible())
            .To(vm => vm.HasTags)
            .WithConversion(inverterVisibilityConverter);

            //Confirm button enabled
            bindingSet.Bind(ConfirmButton)
            .For(v => v.Enabled)
            .To(vm => vm.DescriptionLimitExceeded)
            .WithConversion(invertedBoolConverter);

            bindingSet.Bind(ConfirmButton)
            .For(v => v.Alpha)
            .To(vm => vm.DescriptionLimitExceeded)
            .WithConversion(new BoolToConstantValueConverter <nfloat>(0.5f, 1));

            bindingSet.Bind(BillableView)
            .For(v => v.BindVisibility())
            .To(vm => vm.IsBillableAvailable)
            .WithConversion(visibilityConverter);

            bindingSet.Apply();
        }
コード例 #24
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();
            prepareOnboarding();
            setupTableViewHeader();

            var visibilityConverter       = new MvxVisibilityValueConverter();
            var projectTaskClientCombiner = new ProjectTaskClientValueCombiner(
                CurrentTimeEntryProjectTaskClientLabel.Font.CapHeight,
                Color.Main.CurrentTimeEntryClientColor.ToNativeColor(),
                true
                );
            var startTimeEntryButtonManualModeIconConverter = new BoolToConstantValueConverter <UIImage>(
                UIImage.FromBundle("manualIcon"),
                UIImage.FromBundle("playIcon")
                );
            var durationCombiner = new DurationValueCombiner();

            var bindingSet = this.CreateBindingSet <MainViewController, MainViewModel>();

            // Table view
            tableViewSource = new TimeEntriesLogViewSource(ViewModel.TimeEntries, TimeEntriesLogViewCell.Identifier);
            TimeEntriesLogTableView
            .Rx()
            .Bind(tableViewSource)
            .DisposedBy(disposeBag);

            this.Bind(tableViewSource.FirstCell, f =>
            {
                onFirstTimeEntryChanged(f);
                firstTimeEntryCell = f;
            });

            this.Bind(tableViewSource.ScrollOffset, onTableScroll);

            var continueTimeEntry = Observable.Merge(
                tableViewSource.ContinueTap,
                tableViewSource.SwipeToContinue
                );

            this.Bind(continueTimeEntry, ViewModel.ContinueTimeEntry);
            this.Bind(tableViewSource.SwipeToDelete, ViewModel.TimeEntriesViewModel.DelayDeleteTimeEntry);
            this.Bind(tableViewSource.ItemSelected, ViewModel.SelectTimeEntry);
            this.Bind(ViewModel.TimeEntriesViewModel.ShouldShowUndo, toggleUndoDeletion);

            tableViewSource.SwipeToContinue
            .VoidSubscribe(() =>
            {
                swipeRightStep.Dismiss();
            })
            .DisposedBy(disposeBag);

            tableViewSource.SwipeToDelete
            .VoidSubscribe(() =>
            {
                swipeLeftStep.Dismiss();
            })
            .DisposedBy(disposeBag);

            // Refresh Control
            var refreshControl = new RefreshControl(ViewModel.SyncProgressState, tableViewSource);

            this.Bind(refreshControl.Refresh, ViewModel.RefreshAction);
            TimeEntriesLogTableView.CustomRefreshControl = refreshControl;

            //Commands
            bindingSet.Bind(settingsButton).To(vm => vm.OpenSettingsCommand);
            bindingSet.Bind(StopTimeEntryButton).To(vm => vm.StopTimeEntryCommand);
            bindingSet.Bind(StartTimeEntryButton).To(vm => vm.StartTimeEntryCommand);
            bindingSet.Bind(EditTimeEntryButton).To(vm => vm.EditTimeEntryCommand);
            bindingSet.Bind(syncFailuresButton).To(vm => vm.OpenSyncFailuresCommand);

            bindingSet.Bind(CurrentTimeEntryCard)
            .For(v => v.BindTap())
            .To(vm => vm.EditTimeEntryCommand);

            bindingSet.Bind(suggestionsView)
            .For(v => v.SuggestionTappedCommad)
            .To(vm => vm.SuggestionsViewModel.StartTimeEntryCommand);

            bindingSet.Bind(StartTimeEntryButton)
            .For(v => v.BindLongPress())
            .To(vm => vm.AlternativeStartTimeEntryCommand);

            //Visibility
            var shouldWelcomeBack = ViewModel.ShouldShowWelcomeBack;

            this.Bind(ViewModel.ShouldShowEmptyState, visible => emptyStateView.Hidden = !visible);
            this.Bind(shouldWelcomeBack, WelcomeBackView.Rx().IsVisible());
            this.Bind(shouldWelcomeBack, spiderContainerView.Rx().IsVisible());
            this.Bind(shouldWelcomeBack, visible =>
            {
                if (visible)
                {
                    spiderBroView.Show();
                }
                else
                {
                    spiderBroView.Hide();
                }
            });

            //Text
            bindingSet.Bind(CurrentTimeEntryDescriptionLabel).To(vm => vm.CurrentTimeEntryDescription);

            bindingSet.Bind(CurrentTimeEntryElapsedTimeLabel)
            .ByCombining(durationCombiner,
                         vm => vm.CurrentTimeEntryElapsedTime,
                         vm => vm.CurrentTimeEntryElapsedTimeFormat);

            bindingSet.Bind(CurrentTimeEntryProjectTaskClientLabel)
            .For(v => v.AttributedText)
            .ByCombining(projectTaskClientCombiner,
                         v => v.CurrentTimeEntryProject,
                         v => v.CurrentTimeEntryTask,
                         v => v.CurrentTimeEntryClient,
                         v => v.CurrentTimeEntryProjectColor);

            //The start button
            bindingSet.Bind(StartTimeEntryButton)
            .For(v => v.BindImage())
            .To(vm => vm.IsInManualMode)
            .WithConversion(startTimeEntryButtonManualModeIconConverter);

            //The sync failures button
            bindingSet.Bind(syncFailuresButton)
            .For(v => v.BindVisibility())
            .To(vm => vm.NumberOfSyncFailures)
            .WithConversion(visibilityConverter);

            bindingSet.Apply();

            this.Bind(ViewModel.RatingViewModel.IsFeedbackSuccessViewShowing,
                      SendFeedbackSuccessView.Rx().AnimatedIsVisible());
            this.BindVoid(SendFeedbackSuccessView.Rx().Tap(), ViewModel.RatingViewModel.CloseFeedbackSuccessView);

            ViewModel.ShouldReloadTimeEntryLog
            .VoidSubscribe(reload)
            .DisposedBy(disposeBag);

            View.SetNeedsLayout();
            View.LayoutIfNeeded();

            NSNotificationCenter.DefaultCenter.AddObserver(UIApplication.DidBecomeActiveNotification, onApplicationDidBecomeActive);
        }
コード例 #25
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();

            var invertedBoolConverter = new BoolToConstantValueConverter <bool>(false, true);

            var bindingSet = this.CreateBindingSet <LoginViewController, LoginViewModel>();

            //Text
            bindingSet.Bind(EmailTextField)
            .To(vm => vm.Email)
            .WithConversion(new EmailToStringValueConverter());

            bindingSet.Bind(PasswordTextField)
            .To(vm => vm.Password)
            .WithConversion(new PasswordToStringValueConverter());

            bindingSet.Bind(InfoLabel).To(vm => vm.InfoText);
            bindingSet.Bind(PasswordTextField)
            .For(v => v.BindSecureTextEntry())
            .To(vm => vm.IsPasswordMasked);

            bindingSet.Bind(GoogleSignInButton)
            .For(v => v.BindTitle())
            .To(vm => vm.GoogleButtonText);

            bindingSet.Bind(this)
            .For(v => v.Title)
            .To(vm => vm.Title);

            //Commands
            bindingSet.Bind(GoogleSignInButton).To(vm => vm.GoogleLoginCommand);
            bindingSet.Bind(ForgotPasswordButton).To(vm => vm.ForgotPasswordCommand);
            bindingSet.Bind(PrivacyPolicyButton).To(vm => vm.OpenPrivacyPolicyCommand);
            bindingSet.Bind(TermsOfServiceButton).To(vm => vm.OpenTermsOfServiceCommand);

            bindingSet.Bind(backButton)
            .For(v => v.BindCommand())
            .To(vm => vm.BackCommand);

            bindingSet.Bind(nextButton)
            .For(v => v.BindCommand())
            .To(vm => vm.NextCommand);

            bindingSet.Bind(ShowPasswordButton)
            .For(v => v.BindTap())
            .To(vm => vm.TogglePasswordVisibilityCommand);

            bindingSet.Bind(PasswordManagerButton)
            .For(v => v.BindTap())
            .To(vm => vm.StartPasswordManagerCommand);

            bindingSet.Bind(TryLoggingInInsteadButton)
            .For(v => v.BindTap())
            .To(vm => vm.ChangeSignUpToLoginCommand);

            //Enabled
            bindingSet.Bind(EmailTextField)
            .For(v => v.BindShouldReturn())
            .To(vm => vm.NextCommand);

            bindingSet.Bind(PasswordTextField)
            .For(v => v.BindShouldReturn())
            .To(vm => vm.NextCommand);

            bindingSet.Bind(nextButton)
            .For(v => v.Enabled)
            .To(vm => vm.NextIsEnabled);

            bindingSet.Bind(backButton)
            .For(v => v.Enabled)
            .To(vm => vm.IsLoading)
            .WithConversion(invertedBoolConverter);

            bindingSet.Bind(ForgotPasswordButton)
            .For(v => v.Enabled)
            .To(vm => vm.IsLoading)
            .WithConversion(invertedBoolConverter);

            //Visibility
            bindingSet.Bind(EmailTextField)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.EmailFieldVisible);

            bindingSet.Bind(PasswordTextField)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.IsPasswordPage);

            bindingSet.Bind(ShowPasswordButton)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.ShowPasswordButtonVisible);

            bindingSet.Bind(InfoLabel)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.HasInfoText);

            bindingSet.Bind(ActivityIndicator)
            .For(v => v.BindVisible())
            .To(vm => vm.IsLoading);

            bindingSet.Bind(ForgotPasswordButton)
            .For(v => v.BindVisible())
            .To(vm => vm.ShowForgotPassword);

            bindingSet.Bind(SignUpLabels)
            .For(v => v.BindVisible())
            .To(vm => vm.IsSignUp);

            bindingSet.Bind(PasswordManagerButton)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.PasswordManagerVisible);

            bindingSet.Bind(TryLoggingInInsteadButton)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.TryLoggingInInsteadOfSignup);

            //State
            bindingSet.Bind(EmailTextField)
            .For(v => v.BindFocus())
            .To(vm => vm.IsEmailFocused);

            bindingSet.Bind(PasswordTextField)
            .For(v => v.BindFocus())
            .To(vm => vm.IsPasswordPage);

            bindingSet.Apply();

            EmailTextField.BecomeFirstResponder();

            willEnterForegroundNotification = UIApplication.Notifications.ObserveWillEnterForeground((sender, e) => startAnimations());
        }
コード例 #26
0
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            var templateImage = TotalDurationGraph.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate);

            TotalDurationGraph.Image = templateImage;

            prepareViews();

            var colorConverter = new BoolToConstantValueConverter <UIColor>(
                Color.Reports.Disabled.ToNativeColor(),
                Color.Reports.TotalTimeActivated.ToNativeColor()
                );

            var durationCombiner = new DurationValueCombiner();

            this.DelayBind(() =>
            {
                var bindingSet = this.CreateBindingSet <ReportsHeaderView, ReportsViewModel>();

                //Text
                bindingSet.Bind(BillablePercentageLabel)
                .For(v => v.AttributedText)
                .To(vm => vm.BillablePercentage)
                .WithConversion(new ReportPercentageLabelValueConverter());

                bindingSet.Bind(TotalDurationLabel)
                .For(v => v.Text)
                .ByCombining(durationCombiner,
                             vm => vm.TotalTime,
                             vm => vm.DurationFormat);

                //Loading chart
                bindingSet.Bind(LoadingPieChartView)
                .For(v => v.BindVisibilityWithFade())
                .To(vm => vm.IsLoading);

                bindingSet.Bind(LoadingCardView)
                .For(v => v.BindVisibilityWithFade())
                .To(vm => vm.IsLoading);

                //Pretty stuff
                bindingSet.Bind(PieChartView)
                .For(v => v.Segments)
                .To(vm => vm.GroupedSegments);

                bindingSet.Bind(BillablePercentageView)
                .For(v => v.Percentage)
                .To(vm => vm.BillablePercentage);

                bindingSet.Bind(TotalDurationGraph)
                .For(v => v.TintColor)
                .To(vm => vm.TotalTimeIsZero)
                .WithConversion(colorConverter);

                bindingSet.Bind(TotalDurationLabel)
                .For(v => v.TextColor)
                .To(vm => vm.TotalTimeIsZero)
                .WithConversion(colorConverter);

                //Visibility
                bindingSet.Bind(EmptyStateView)
                .For(v => v.BindVisible())
                .To(vm => vm.ShowEmptyState);

                bindingSet.Apply();
            });
        }
コード例 #27
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            TitleLabel.Text                  = Resources.Edit;
            BillableLabel.Text               = Resources.Billable;
            StartDateDescriptionLabel.Text   = Resources.Startdate;
            DurationDescriptionLabel.Text    = Resources.Duration;
            StartDescriptionLabel.Text       = Resources.Start;
            EndDescriptionLabel.Text         = Resources.End;
            ErrorMessageTitleLabel.Text      = Resources.Oops;
            AddProjectTaskLabel.Text         = Resources.AddProjectTask;
            CategorizeWithProjectsLabel.Text = Resources.CategorizeYourTimeWithProjects;
            AddTagsLabel.Text                = Resources.AddTags;
            DeleteButton.SetTitle(Resources.Delete, UIControlState.Normal);
            ConfirmButton.SetTitle(Resources.ConfirmChanges, UIControlState.Normal);

            prepareViews();
            prepareOnboarding();

            contentSizeChangedDisposable = ScrollViewContent.AddObserver(boundsKey, NSKeyValueObservingOptions.New, onContentSizeChanged);

            var durationCombiner            = new DurationValueCombiner();
            var dateCombiner                = new DateTimeOffsetDateFormatValueCombiner(TimeZoneInfo.Local);
            var timeCombiner                = new DateTimeOffsetTimeFormatValueCombiner(TimeZoneInfo.Local);
            var visibilityConverter         = new MvxVisibilityValueConverter();
            var invertedBoolConverter       = new BoolToConstantValueConverter <bool>(false, true);
            var inverterVisibilityConverter = new MvxInvertedVisibilityValueConverter();
            var projectTaskClientCombiner   = new ProjectTaskClientValueCombiner(
                ProjectTaskClientLabel.Font.CapHeight,
                Color.EditTimeEntry.ClientText.ToNativeColor(),
                false
                );
            var stopRunningTimeEntryAndSelectStopTimeForStoppedConverter = new BoolToConstantValueConverter <IMvxCommand>(
                ViewModel.StopCommand, ViewModel.SelectStopTimeCommand);

            var isInaccessibleTextColorConverter = new BoolToConstantValueConverter <UIColor>(
                Color.Common.Disabled.ToNativeColor(),
                Color.Common.TextColor.ToNativeColor()
                );

            var showTagsCombiner = new ShowTagsValueCombiner();

            var bindingSet = this.CreateBindingSet <EditTimeEntryViewController, EditTimeEntryViewModel>();

            //Error message view
            bindingSet.Bind(ErrorMessageLabel)
            .For(v => v.Text)
            .To(vm => vm.SyncErrorMessage);

            bindingSet.Bind(ErrorView)
            .For(v => v.BindTap())
            .To(vm => vm.DismissSyncErrorMessageCommand);

            bindingSet.Bind(ErrorView)
            .For(v => v.BindVisible())
            .To(vm => vm.SyncErrorMessageVisible)
            .WithConversion(inverterVisibilityConverter);

            //Text
            bindingSet.Bind(RemainingCharacterCount)
            .To(vm => vm.DescriptionRemainingLength);

            bindingSet.Bind(RemainingCharacterCount)
            .For(v => v.BindVisible())
            .To(vm => vm.DescriptionLimitExceeded);

            bindingSet.Bind(DescriptionTextView)
            .For(v => v.BindText())
            .To(vm => vm.Description);

            bindingSet.Bind(DescriptionTextView)
            .For(v => v.BindDidBecomeFirstResponder())
            .To(vm => vm.StartEditingDescriptionCommand);

            bindingSet.Bind(DurationLabel)
            .ByCombining(durationCombiner,
                         vm => vm.Duration,
                         vm => vm.DurationFormat);

            bindingSet.Bind(ProjectTaskClientLabel)
            .For(v => v.AttributedText)
            .ByCombining(projectTaskClientCombiner,
                         v => v.Project,
                         v => v.Task,
                         v => v.Client,
                         v => v.ProjectColor);

            bindingSet.Bind(StartDateLabel)
            .ByCombining(dateCombiner,
                         vm => vm.StartTime,
                         vm => vm.DateFormat);

            bindingSet.Bind(StartTimeLabel)
            .ByCombining(timeCombiner,
                         vm => vm.StartTime,
                         vm => vm.TimeFormat);

            bindingSet.Bind(EndTimeLabel)
            .ByCombining(timeCombiner,
                         vm => vm.StopTime,
                         vm => vm.TimeFormat);

            //Commands
            bindingSet.Bind(CloseButton).To(vm => vm.CloseCommand);
            bindingSet.Bind(DeleteButton).To(vm => vm.DeleteCommand);
            bindingSet.Bind(ConfirmButton).To(vm => vm.SaveCommand);

            bindingSet.Bind(DurationView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectDurationCommand);

            bindingSet.Bind(StartTimeView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectStartTimeCommand);

            bindingSet.Bind(StopButton)
            .To(vm => vm.StopCommand);

            bindingSet.Bind(EndTimeView)
            .For(v => v.BindTap())
            .To(vm => vm.IsTimeEntryRunning)
            .WithConversion(stopRunningTimeEntryAndSelectStopTimeForStoppedConverter);

            bindingSet.Bind(ProjectTaskClientLabel)
            .For(v => v.BindTap())
            .To(vm => vm.SelectProjectCommand);

            bindingSet.Bind(AddProjectAndTaskView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectProjectCommand);

            bindingSet.Bind(StartDateView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectStartDateCommand);

            bindingSet.Bind(TagsTextView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectTagsCommand);

            bindingSet.Bind(AddTagsView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectTagsCommand);

            bindingSet.Bind(BillableSwitch)
            .For(v => v.BindValueChanged())
            .To(vm => vm.ToggleBillableCommand);

            //End time and the stop button visibility
            bindingSet.Bind(StopButton)
            .For(v => v.BindVisible())
            .To(vm => vm.IsTimeEntryRunning)
            .WithConversion(inverterVisibilityConverter);

            bindingSet.Bind(EndTimeLabel)
            .For(v => v.BindVisible())
            .To(vm => vm.IsTimeEntryRunning)
            .WithConversion(visibilityConverter);

            //Project visibility
            bindingSet.Bind(AddProjectAndTaskView)
            .For(v => v.BindVisible())
            .To(vm => vm.Project)
            .WithConversion(visibilityConverter);

            bindingSet.Bind(ProjectTaskClientLabel)
            .For(v => v.BindVisible())
            .To(vm => vm.Project)
            .WithConversion(inverterVisibilityConverter);

            //Tags visibility
            bindingSet.Bind(AddTagsView)
            .For(v => v.BindVisible())
            .To(vm => vm.HasTags)
            .WithConversion(visibilityConverter);

            bindingSet.Bind(TagsTextView)
            .For(v => v.BindVisible())
            .To(vm => vm.HasTags)
            .WithConversion(inverterVisibilityConverter);

            //Confirm button enabled
            bindingSet.Bind(ConfirmButton)
            .For(v => v.Enabled)
            .To(vm => vm.DescriptionLimitExceeded)
            .WithConversion(invertedBoolConverter);

            bindingSet.Bind(ConfirmButton)
            .For(v => v.Alpha)
            .To(vm => vm.DescriptionLimitExceeded)
            .WithConversion(new BoolToConstantValueConverter <nfloat>(0.5f, 1));

            bindingSet.Bind(BillableView)
            .For(v => v.BindVisibility())
            .To(vm => vm.IsBillableAvailable)
            .WithConversion(visibilityConverter);

            //Regarding inaccessible entries
            getLabelsToChangeColorWhenEditingInaccessibleEntry().ForEach(createTextColorBindingForInaccessibleEntries);

            bindingSet.Bind(DescriptionTextView)
            .For(v => v.TextColor)
            .To(vm => vm.IsInaccessible)
            .WithConversion(isInaccessibleTextColorConverter);

            bindingSet.Bind(DescriptionTextView)
            .For(v => v.UserInteractionEnabled)
            .To(vm => vm.IsInaccessible)
            .WithConversion(invertedBoolConverter);

            bindingSet.Bind(BillableSwitch)
            .For(v => v.Enabled)
            .To(vm => vm.IsInaccessible)
            .WithConversion(invertedBoolConverter);

            bindingSet.Bind(TagsContainerView)
            .For(v => v.Hidden)
            .ByCombining(showTagsCombiner,
                         vm => vm.IsInaccessible,
                         vm => vm.HasTags)
            .WithConversion(invertedBoolConverter);

            bindingSet.Bind(TagsSeparator)
            .For(v => v.Hidden)
            .ByCombining(showTagsCombiner,
                         vm => vm.IsInaccessible,
                         vm => vm.HasTags)
            .WithConversion(invertedBoolConverter);

            bindingSet.Apply();

            void createTextColorBindingForInaccessibleEntries(UILabel label)
            {
                bindingSet.Bind(label)
                .For(v => v.TextColor)
                .To(vm => vm.IsInaccessible)
                .WithConversion(isInaccessibleTextColorConverter);
            }
        }
コード例 #28
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var signupButtonTitleConverter  = new BoolToConstantValueConverter <string>("", Resources.SignUpTitle);
            var invertedVisibilityConverter = new MvxInvertedVisibilityValueConverter();

            var bindingSet = this.CreateBindingSet <SignupViewController, SignupViewModel>();

            //Text
            bindingSet.Bind(ErrorLabel).To(vm => vm.ErrorText);
            bindingSet.Bind(EmailTextField)
            .To(vm => vm.Email)
            .WithConversion(new EmailToStringValueConverter());

            bindingSet.Bind(PasswordTextField)
            .To(vm => vm.Password)
            .WithConversion(new PasswordToStringValueConverter());

            bindingSet.Bind(SignupButton)
            .For(v => v.BindAnimatedTitle())
            .To(vm => vm.IsLoading)
            .WithConversion(signupButtonTitleConverter);

            bindingSet.Bind(SelectCountryButton)
            .For(v => v.BindAnimatedTitle())
            .To(vm => vm.CountryButtonTitle);

            //Commands
            bindingSet.Bind(SignupButton).To(vm => vm.SignupCommand);
            bindingSet.Bind(GoogleSignupButton).To(vm => vm.GoogleSignupCommand);
            bindingSet.Bind(ShowPasswordButton).To(vm => vm.TogglePasswordVisibilityCommand);
            bindingSet.Bind(SelectCountryButton).To(vm => vm.PickCountryCommand);
            bindingSet.Bind(LoginCard)
            .For(v => v.BindTap())
            .To(vm => vm.LoginCommand);

            //Visibility
            bindingSet.Bind(ErrorLabel)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.HasError);

            bindingSet.Bind(ActivityIndicator)
            .For(v => v.BindVisibilityWithFade())
            .To(vm => vm.IsLoading);

            bindingSet.Bind(PasswordTextField)
            .For(v => v.BindSecureTextEntry())
            .To(vm => vm.IsPasswordMasked);

            bindingSet.Bind(ShowPasswordButton)
            .For(v => v.BindVisible())
            .To(vm => vm.IsShowPasswordButtonVisible);

            bindingSet.Bind(PasswordTextField)
            .For(v => v.BindFirstResponder())
            .To(vm => vm.IsShowPasswordButtonVisible)
            .Mode(MvxBindingMode.OneWayToSource);

            bindingSet.Bind(CountryNotSelectedImageView)
            .For(v => v.BindAnimatedVisibility())
            .To(vm => vm.IsCountryErrorVisible);

            bindingSet.Apply();

            prepareViews();
        }
コード例 #29
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();

            source = new MainTableViewSource(TimeEntriesLogTableView);

            prepareOnboarding();

            var suggestionsView = new SuggestionsView();

            TimeEntriesLogTableView.TableHeaderView = suggestionsView;
            TimeEntriesLogTableView.Source          = source;

            suggestionsView.DataContext = ViewModel.SuggestionsViewModel;

            source.Initialize();

            var timeEntriesLogFooter = new UIView(
                new CGRect(0, 0, UIScreen.MainScreen.Bounds.Width, 64)
                );
            var colorConverter                = new MvxNativeColorValueConverter();
            var visibilityConverter           = new MvxVisibilityValueConverter();
            var parametricTimeSpanConverter   = new ParametricTimeSpanToDurationValueConverter();
            var invertedVisibilityConverter   = new MvxInvertedVisibilityValueConverter();
            var timeEntriesLogFooterConverter = new BoolToConstantValueConverter <UIView>(new UIView(), timeEntriesLogFooter);
            var projectTaskClientCombiner     = new ProjectTaskClientValueCombiner(
                CurrentTimeEntryProjectTaskClientLabel.Font.CapHeight,
                Color.Main.CurrentTimeEntryClientColor.ToNativeColor(),
                true
                );
            var startTimeEntryButtonManualModeIconConverter = new BoolToConstantValueConverter <UIImage>(
                UIImage.FromBundle("manualIcon"),
                UIImage.FromBundle("playIcon")
                );

            var bindingSet = this.CreateBindingSet <MainViewController, MainViewModel>();

            //Table view
            bindingSet.Bind(source)
            .For(v => v.ObservableCollection)
            .To(vm => vm.TimeEntriesLogViewModel.TimeEntries);

            bindingSet.Bind(source)
            .For(v => v.SyncProgress)
            .To(vm => vm.SyncingProgress);

            bindingSet.Bind(TimeEntriesLogTableView)
            .For(v => v.TableFooterView)
            .To(vm => vm.TimeEntriesLogViewModel.IsEmpty)
            .WithConversion(timeEntriesLogFooterConverter);

            //Commands
            bindingSet.Bind(reportsButton).To(vm => vm.OpenReportsCommand);
            bindingSet.Bind(settingsButton).To(vm => vm.OpenSettingsCommand);
            bindingSet.Bind(StopTimeEntryButton).To(vm => vm.StopTimeEntryCommand);
            bindingSet.Bind(StartTimeEntryButton).To(vm => vm.StartTimeEntryCommand);
            bindingSet.Bind(EditTimeEntryButton).To(vm => vm.EditTimeEntryCommand);

            bindingSet.Bind(CurrentTimeEntryCard)
            .For(v => v.BindTap())
            .To(vm => vm.EditTimeEntryCommand);

            bindingSet.Bind(source)
            .For(v => v.SelectionChangedCommand)
            .To(vm => vm.TimeEntriesLogViewModel.EditCommand);

            bindingSet.Bind(source)
            .For(v => v.ContinueTimeEntryCommand)
            .To(vm => vm.TimeEntriesLogViewModel.ContinueTimeEntryCommand);

            bindingSet.Bind(source)
            .For(v => v.RefreshCommand)
            .To(vm => vm.RefreshCommand);

            bindingSet.Bind(source)
            .For(v => v.DeleteTimeEntryCommand)
            .To(vm => vm.TimeEntriesLogViewModel.DeleteCommand);

            bindingSet.Bind(suggestionsView)
            .For(v => v.SuggestionTappedCommad)
            .To(vm => vm.SuggestionsViewModel.StartTimeEntryCommand);

            //Visibility
            bindingSet.Bind(WelcomeBackView)
            .For(v => v.BindVisibility())
            .To(vm => vm.ShouldShowWelcomeBack)
            .WithConversion(visibilityConverter);

            bindingSet.Bind(spiderContainerView)
            .For(v => v.BindVisibility())
            .To(vm => vm.ShouldShowWelcomeBack)
            .WithConversion(visibilityConverter);

            bindingSet.Bind(spiderBroView)
            .For(v => v.BindSpiderVisibility())
            .To(vm => vm.ShouldShowWelcomeBack);

            bindingSet.Bind(emptyStateView)
            .For(v => v.BindVisibility())
            .To(vm => vm.ShouldShowEmptyState)
            .WithConversion(visibilityConverter);

            //Text
            bindingSet.Bind(CurrentTimeEntryDescriptionLabel).To(vm => vm.CurrentTimeEntryDescription);
            bindingSet.Bind(CurrentTimeEntryElapsedTimeLabel)
            .To(vm => vm.CurrentTimeEntryElapsedTime)
            .WithConversion(parametricTimeSpanConverter, DurationFormat.Improved);

            bindingSet.Bind(CurrentTimeEntryProjectTaskClientLabel)
            .For(v => v.AttributedText)
            .ByCombining(projectTaskClientCombiner,
                         v => v.CurrentTimeEntryProject,
                         v => v.CurrentTimeEntryTask,
                         v => v.CurrentTimeEntryClient,
                         v => v.CurrentTimeEntryProjectColor);

            //The start button
            bindingSet.Bind(StartTimeEntryButton)
            .For(v => v.BindImage())
            .To(vm => vm.IsInManualMode)
            .WithConversion(startTimeEntryButtonManualModeIconConverter);

            bindingSet.Apply();

            View.SetNeedsLayout();
            View.LayoutIfNeeded();
        }
コード例 #30
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            prepareViews();

            Title = ViewModel.Title;

            var inverseBoolConverter            = new BoolToConstantValueConverter <bool>(false, true);
            var visibilityConverter             = new MvxVisibilityValueConverter();
            var durationFormatToStringConverter = new DurationFormatToStringValueConverter();

            var bindingSet = this.CreateBindingSet <SettingsViewController, SettingsViewModel>();

            // Text
            bindingSet.Bind(EmailLabel).To(vm => vm.Email);
            bindingSet.Bind(WorkspaceLabel).To(vm => vm.WorkspaceName);
            bindingSet.Bind(DateFormatLabel).To(vm => vm.DateFormat.Localized);
            bindingSet.Bind(DurationFormatLabel)
            .To(vm => vm.DurationFormat)
            .WithConversion(durationFormatToStringConverter);
            bindingSet.Bind(BeginningOfWeekLabel).To(vm => vm.BeginningOfWeek);
            bindingSet.Bind(VersionLabel).To(vm => vm.Version);

            // Commands
            bindingSet.Bind(LogoutButton).To(vm => vm.LogoutCommand);
            bindingSet.Bind(EmailView)
            .For(v => v.BindTap())
            .To(vm => vm.EditProfileCommand);

            bindingSet.Bind(DateFormatView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectDateFormatCommand);

            bindingSet.Bind(DurationFormatView)
            .For(verticalSpacing => verticalSpacing.BindTap())
            .To(vm => vm.SelectDurationFormatCommand);

            bindingSet.Bind(WorkspaceView)
            .For(v => v.BindTap())
            .To(vm => vm.PickWorkspaceCommand);

            bindingSet.Bind(ManualModeView)
            .For(v => v.BindTap())
            .To(vm => vm.ToggleManualModeCommand);

            bindingSet.Bind(TwentyFourHourClockView)
            .For(v => v.BindTap())
            .To(vm => vm.ToggleUseTwentyFourHourClockCommand);

            bindingSet.Bind(TwentyFourHourClockSwitch)
            .For(v => v.BindValueChanged())
            .To(vm => vm.ToggleUseTwentyFourHourClockCommand);

            bindingSet.Bind(BeginningOfWeekView)
            .For(v => v.BindTap())
            .To(vm => vm.SelectBeginningOfWeekCommand);

            bindingSet.Bind(FeedbackView)
            .For(v => v.BindTap())
            .To(vm => vm.SubmitFeedbackCommand);

            bindingSet.Bind(AboutView)
            .For(v => v.BindTap())
            .To(vm => vm.AboutCommand);

            // Logout process
            bindingSet.Bind(LogoutButton)
            .For(btn => btn.Enabled)
            .To(vm => vm.IsLoggingOut)
            .WithConversion(inverseBoolConverter);

            bindingSet.Bind(NavigationItem)
            .For(nav => nav.BindHidesBackButton())
            .To(vm => vm.IsLoggingOut);

            bindingSet.Bind(SyncingView)
            .For(view => view.BindVisibility())
            .To(vm => vm.IsRunningSync)
            .WithConversion(visibilityConverter);

            bindingSet.Bind(SyncedView)
            .For(view => view.BindVisibility())
            .To(vm => vm.IsSynced)
            .WithConversion(visibilityConverter);

            bindingSet.Bind(LoggingOutView)
            .For(view => view.BindVisibility())
            .To(vm => vm.IsLoggingOut)
            .WithConversion(visibilityConverter);

            // Switches
            bindingSet.Bind(TwentyFourHourClockSwitch)
            .For(v => v.BindAnimatedOn())
            .To(vm => vm.UseTwentyFourHourClock);

            bindingSet.Bind(ManualModeSwitch)
            .For(v => v.BindAnimatedOn())
            .To(vm => vm.IsManualModeEnabled);

            bindingSet.Apply();

            willEnterForegroundNotification = UIApplication.Notifications.ObserveWillEnterForeground((sender, e) => startAnimations());
        }