65.9K
CodeProject 正在变化。 阅读更多。
Home

可编辑的 TimeSpan

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (3投票s)

2014年11月16日

CPOL
viewsIcon

9439

一个 TimeSpan 包装类,使用 System.TimeSpan 作为底层字段。

引言

在 WPF 中,你可以使用绑定将数据属性与控件绑定。但是,TimeSpan 结构体的实例是不可变的,因此你无法创建双向绑定到其小时、分钟、秒等属性。下面的代码是解决此问题的方法。

Using the Code

如下所示

   public class EditableTimeSpan : INotifyPropertyChanged
    {
        TimeSpan _timespan;

        public TimeSpan TimeSpan
        {
            get { return _timespan; }
            set { _timespan = value; FireAll(); }
        }
        public int Hours
        {
            get { return TimeSpan.Hours; }
            set
            {
                if (TimeSpan.Hours != value)
                {
                    TimeSpan = new TimeSpan(value, TimeSpan.Minutes, TimeSpan.Seconds);
                    FireAll();
                }
            }
        }
        public int Minutes
        {
            get { return TimeSpan.Minutes; }
            set
            {
                if (TimeSpan.Minutes != value)
                {
                    TimeSpan = new TimeSpan(TimeSpan.Hours, value, TimeSpan.Seconds);
                    FireAll();
                }
            }
        }
        public int Seconds
        {
            get { return TimeSpan.Seconds; }
            set
            {
                if (TimeSpan.Seconds != value)
                {
                    TimeSpan = new TimeSpan(TimeSpan.Hours, TimeSpan.Minutes, value);
                    FireAll();
                }
            }
        }
        public double TotalSeconds
        {
            get { return TimeSpan.TotalSeconds; }
            set
            {
                TimeSpan = TimeSpan.FromSeconds(value);
                FireAll();
            }
        }
        public static explicit operator TimeSpan(EditableTimeSpan ets)
        {
            return ets.TimeSpan;
        }
        void FireAll()
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, MinutesArgs);
                PropertyChanged(this, HoursArgs);
                PropertyChanged(this, TotalSecondsArgs);
                PropertyChanged(this, SecondsArgs);
            }
        }
        public static explicit operator EditableTimeSpan(TimeSpan ets)
        {
            return new EditableTimeSpan(ets);
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private PropertyChangedEventArgs MinutesArgs = new PropertyChangedEventArgs("Minutes");
        private PropertyChangedEventArgs TotalSecondsArgs = new PropertyChangedEventArgs("TotalSeconds");
        private PropertyChangedEventArgs SecondsArgs = new PropertyChangedEventArgs("Seconds");
        private PropertyChangedEventArgs HoursArgs = new PropertyChangedEventArgs("Hours");

        public override string ToString()
        {
            return TimeSpan.ToString();
        }
        public string ToString(string format)
        {
            return TimeSpan.ToString(format);
        }
        public EditableTimeSpan()
        {
            _timespan = new TimeSpan();
        }
        public EditableTimeSpan(TimeSpan timeSpan)
        {
            _timespan = timeSpan;
        }
    }
© . All rights reserved.