MVVM я реализую это правильно - PullRequest
1 голос
/ 11 апреля 2011

Я пытался обернуть голову вокруг mvvm в течение прошлой недели или больше и все еще немного борюсь. Я посмотрел видео Джейсона Долингера MVVM и прошел уроки Рида Копси, и все еще задаюсь вопросом, правильно ли я делаю это ... я создал очень простое приложение с часами, которое я опубликую ниже. Выходные данные программы ожидаемые, однако меня больше интересует, правильно ли я использую шаблон. Любые мысли, комментарии и т. Д. Будут оценены.

моя модель

using System;
using System.Threading;

namespace Clock
{
    public class ClockModel
    {
        private const int TIMER_INTERVAL = 50;

        private DateTime _time;

        public event Action<DateTime> TimeArrived;

        public ClockModel()
        {
            Thread thread = new Thread(new ThreadStart(GenerateTimes));
            thread.IsBackground = true;
            thread.Priority = ThreadPriority.Normal;
            thread.Start();
        }

        public DateTime DateTime
        {
            get
            {
                return _time;
            }
            set
            {
                this._time = value;
                if (TimeArrived != null)
                {
                    TimeArrived(DateTime);
                }
            }
        }

        private void GenerateTimes()
        {
            while (true)
            {
                DateTime = DateTime.Now;
                Thread.Sleep(TIMER_INTERVAL);
            }
        }
    }
}

мой взгляд

<Window x:Class="Clock.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ViewModels="clr-namespace:Clock"
        Title="MainWindow" Height="75" Width="375">
    <Window.DataContext>
        <ViewModels:ClockViewModel />
    </Window.DataContext>
    <StackPanel Background="Black">
            <TextBlock Text="{Binding Path=DateTime}" Foreground="White" Background="Black" FontSize="30" TextAlignment="Center" />
    </StackPanel>
</Window>

модель моего взгляда

using System;
using System.ComponentModel;

namespace Clock
{
    public class ClockViewModel : INotifyPropertyChanged
    {
        private DateTime _time;
        private ClockModel clock;

        public ClockViewModel()
        {
            clock = new ClockModel();
            clock.TimeArrived += new Action<DateTime>(clock_TimeArrived);
        }

        private void clock_TimeArrived(DateTime time)
        {
            DateTime = time;
            this.RaisePropertyChanged("DateTime");
        }

        public DateTime DateTime 
        {
            get
            {
                return _time;
            }

            set
            {
                _time = value;
            }
        }


        /// <summary>
        /// Occurs when a property value changes.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Raises the property changed event.
        /// </summary>
        /// <param name="propertyName">Name of the property.</param>
        private void RaisePropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 11 апреля 2011

То, как вы это делаете, прекрасно. Есть только одна вещь, которую я хотел бы изменить: переместить вызов на RaisePropertyChange в установщик свойства. Вот как это обычно делается, и это не позволяет вам забыть поднять уведомление при установке свойства.

1 голос
/ 11 апреля 2011

По моему мнению, ваша реализация выглядит хорошо с точки зрения разделения интересов, хотя вы могли бы быть заинтересованы в делегировании вашего Model метода для Command, тогда вы можете присоединить его, скажем, к событию Loaded вашего основного пользовательского интерфейса.,Это определенно личное предпочтение, но в качестве хорошей практики я стараюсь сохранять соотношение 1: 1 между View: ViewModel и Model.Method: Command

0 голосов
/ 11 апреля 2011

Для некоторых обычных функций использование MVVM довольно легко, когда вы начинаете касаться отображения окна сообщения. отображать отдельные окна и связь между view и viewmodel. тогда вы найдете что-то хитрое ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...