Привязка действия кнопки Windows Phone 7 к методу в Expression Blend 4 - PullRequest
0 голосов
/ 25 марта 2011

Я впервые пробую Windows Phone 7 dev.Я решил попробовать портировать пример Silverlight Timer из примеров по умолчанию в Expression Blend 4. Пример таймера для полноценного silverlight связывает класс TimerModel с таймером, тумблером запуска / остановки и т. Д.создать источник данных / datacontext и привязать свойства к объектам на экране.Однако метод Reset (), который является пустым, не отображается в параметрах привязки для приложения Windows Phone 7.Это один и тот же класс в обоих, но по какой-то причине метод void не является привязываемым.Что-то, что мне нужно включить, было в полном приложении Silverlight, которого нет в Windows Phone 7?Есть ли что-то конкретное, что делает свойства или методы класса связанными, когда это источник данных?Является ли это лишь одним из ограничений набора функций Silverlight в Windows Phone 7?


Ниже приведен класс, который одинаков в обоих приложениях.Я хочу привязать нажатие кнопки к методу Reset ().

namespace Time
{
    using System;
    using System.ComponentModel;
    using System.Windows.Threading;
    using System.Windows.Data;

    public class TimerModel : INotifyPropertyChanged
    {
        private bool isRunning;
        private DispatcherTimer timer;
        private TimeSpan time;
        private DateTime lastTick;

        public string FormattedTime
        {
            get 
            {
                return string.Format("{0:#0}:{1:00}:{2:00.00}", this.time.Hours, this.time.Minutes, (this.time.Seconds + (this.time.Milliseconds / 1000.0d)));
            }
        }

        private void UpdateTimes()
        {
            this.NotifyPropertyChanged("FormattedTime");
            this.NotifyPropertyChanged("Hours");
            this.NotifyPropertyChanged("Minutes");
            this.NotifyPropertyChanged("Seconds");
        }

        public bool Increment
        {
            get;
            set;
        }

        public int Hours
        {
            get
            {
                return this.time.Hours;
            }
            set
            {
                this.time = this.time.Add(TimeSpan.FromHours(value - this.time.Hours));
                this.UpdateTimes();
            }
        }

        public int Minutes
        {
            get
            {
                return this.time.Minutes;
            }
            set
            {
                this.time = this.time.Add(TimeSpan.FromMinutes(value - this.time.Minutes));
                this.UpdateTimes();
            }
        }

        public int Seconds
        {
            get
            {
                return this.time.Seconds;
            }
            set
            {
                this.time = this.time.Add(TimeSpan.FromSeconds(value - this.time.Seconds));
                this.UpdateTimes();
            }
        }

        public bool IsRunning
        {
            get { return this.isRunning; }
            set
            {
                if (this.isRunning != value)
                {
                    this.isRunning = value;
                    if (this.isRunning)
                    {
                        this.StartTimer();
                    }
                    else
                    {
                        this.StopTimer();
                    }
                    this.NotifyPropertyChanged("IsRunning");
                }
            }
        }

        private void StartTimer()
        {
            if (this.timer != null)
            {
                this.StopTimer();
            }
            this.timer = new DispatcherTimer();
            this.timer.Interval = TimeSpan.FromMilliseconds(1);
            this.timer.Tick += this.OnTimerTick;
            this.lastTick = DateTime.Now;
            this.timer.Start();
        }

        private void StopTimer()
        {
            if (this.timer != null)
            {
                this.timer.Stop();
                this.timer = null;
            }
        }

        private void OnTimerTick(object sender, EventArgs e)
        {
            DateTime now = DateTime.Now;
            TimeSpan diff = now - this.lastTick;
            this.lastTick = now;

            if (this.Increment)
            {
                this.time = this.time.Add(diff);
            }
            else
            {
                this.time = this.time.Subtract(diff);
            }
            if (this.time.TotalMilliseconds <= 0)
            {
                this.time = TimeSpan.FromMilliseconds(0);
                this.IsRunning = false;
            }
            this.UpdateTimes();
        }

        public void Reset()
        {
            this.time = new TimeSpan();
            this.UpdateTimes();
        }

        public TimerModel()
        {
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

}

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Я использую платформу Caliburn Micro MVVM. Это позволяет связывать по соглашению, поэтому, если вы вызываете свою кнопку RefreshButton и у вас есть метод в вашей модели представления с именем RefreshButton, он будет автоматически связан с событием Click. Очень мощный и легкий.

1 голос
/ 25 марта 2011

Я обнаружил, что Silverlight использует стандартное действие CallMethodAction, которое недоступно в Windows Phone 7. Похоже, у меня есть два варианта:

  1. Использовать событие onClick как традиционные формыи просто используйте codebehind для программного вызова метода.
  2. Создайте свое собственное действие для воссоздания CallMethodAction. Существует также проект с открытым исходным кодом, который содержит порт метода из полномасштабного Silverlight, который вы можете найти в Codeplex.
...