Newer
Older
Correlator / Correlator / ViewModels / NumericKeypadDialogViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using Correlator.Events;
using Correlator.Model;
using Correlator.Util;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Services.Dialogs;

namespace Correlator.ViewModels
{
    public class NumericKeypadDialogViewModel : BindableBase, IDialogAware
    {
        /// <summary>
        /// 空实现
        /// </summary>
        public event Action<IDialogResult> RequestClose
        {
            add { }
            remove { }
        }

        #region VM

        public string Title => "数字键盘";

        private string _inputNumber = string.Empty;

        public string InputNumber
        {
            get => _inputNumber;
            set
            {
                _inputNumber = value;
                RaisePropertyChanged();
            }
        }

        private string _workMode = string.Empty;

        public string WorkMode
        {
            get => _workMode;
            set
            {
                _workMode = value;
                RaisePropertyChanged();
            }
        }

        #endregion

        #region DelegateCommand

        public DelegateCommand<string> NumberSevenCommand { get; }
        public DelegateCommand<string> NumberEightCommand { get; }
        public DelegateCommand<string> NumberNineCommand { get; }
        public DelegateCommand<string> NumberFourCommand { get; }
        public DelegateCommand<string> NumberFiveCommand { get; }
        public DelegateCommand<string> NumberSixCommand { get; }
        public DelegateCommand<string> NumberOneCommand { get; }
        public DelegateCommand<string> NumberTwoCommand { get; }
        public DelegateCommand<string> NumberThreeCommand { get; }
        public DelegateCommand DeleteNumberCommand { get; }
        public DelegateCommand<string> NumberZeroCommand { get; }
        public DelegateCommand DetermineCommand { get; }

        #endregion

        /// <summary>
        /// 数字键盘缓存
        /// </summary>
        private static readonly List<string> NumberCache = new List<string>();

        private readonly IEventAggregator _eventAggregator;

        public NumericKeypadDialogViewModel(IEventAggregator eventAggregator)
        {
            _eventAggregator = eventAggregator;

            NumberSevenCommand = new DelegateCommand<string>(HandleNumber);
            NumberEightCommand = new DelegateCommand<string>(HandleNumber);
            NumberNineCommand = new DelegateCommand<string>(HandleNumber);

            NumberFourCommand = new DelegateCommand<string>(HandleNumber);
            NumberFiveCommand = new DelegateCommand<string>(HandleNumber);
            NumberSixCommand = new DelegateCommand<string>(HandleNumber);

            NumberOneCommand = new DelegateCommand<string>(HandleNumber);
            NumberTwoCommand = new DelegateCommand<string>(HandleNumber);
            NumberThreeCommand = new DelegateCommand<string>(HandleNumber);

            DeleteNumberCommand = new DelegateCommand(DeleteNumber);
            NumberZeroCommand = new DelegateCommand<string>(HandleNumber);
            DetermineCommand = new DelegateCommand(Determine);
        }

        private void HandleNumber(string value)
        {
            NumberCache.Add(value);
            InputNumber = string.Join("", NumberCache);
        }

        private void DeleteNumber()
        {
            if (NumberCache.Any())
            {
                NumberCache.RemoveAt(NumberCache.Count - 1);
                InputNumber = string.Join("", NumberCache);
            }
        }

        private void Determine()
        {
            var number = !NumberCache.Any() ? 0 : Convert.ToInt32(string.Join("", NumberCache));

            //管径
            if (RuntimeCache.FillDataTextBox.Equals("PipeDiameterTextBox"))
            {
                if (number > 1000)
                {
                    MessageBox.Show("管径超过限制,请重新输入", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Stop);
                    return;
                }
            }

            //管长
            if (RuntimeCache.FillDataTextBox.Equals("PipeLengthTextBox"))
            {
                if (number > 1000)
                {
                    MessageBox.Show("管长超过限制,请重新输入", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Stop);
                    return;
                }
            }

            _eventAggregator.GetEvent<NumericKeypadEvent>().Publish(new NumberStruct
            {
                TextBoxName = RuntimeCache.FillDataTextBox,
                NumberValue = number.ToString()
            });

            //重置数字键盘参数
            NumberCache.Clear();
            InputNumber = string.Join("", NumberCache);
        }

        public bool CanCloseDialog()
        {
            return true;
        }

        public void OnDialogClosed()
        {
        }

        public void OnDialogOpened(IDialogParameters parameters)
        {
            WorkMode = RuntimeCache.IsHydrophone ? "水听器模式" : "加速度计模式";
        }
    }
}