Отмена в WPF M-V-VM, как это соответствует?

Просто используйте следующий шаблон, чтобы получить ожидаемый результат:

    try {
        String time = "06:06:30";
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
        Date dt = sdf.parse(time);

        SimpleDateFormat sdfs = new SimpleDateFormat("hh:mm a");
        String formatedTime = sdfs.format(dt);

        Log.v("parseTime", formatedTime);

    } catch (ParseException e) {
        e.printStackTrace();
    }

Удачного кодирования:)

12
задан Tormod Fjeldskår 25 May 2009 в 04:47
поделиться

2 ответа

Вот решение, которое я использовал для своего проекта. Решение оказалось безупречным.

Система использует объекты событий отмены, где каждое событие отмены знает, как отменять и восстанавливать само себя.

interface IUndoEvent
{
    void Undo();
    void Redo();
}

Я смог построить систему, реализовав только 2 события отмены: одно для изменения собственности; один для изменений коллекции.

Идея состоит в том, что эти события реализуют Undo / Redo путем непосредственного изменения модели.

class PropertyChangeUndoEvent : IUndoEvent
{
    private ModelBase _target;
    private string _propertyName;
    private object _oldValue;
    private object _newValue;

    public PropertyChangeUndoEvent(ModelBase target, string propertyName, object oldValue, object newValue)
    {
        _target = target;
        _propertyName = propertyName;
        _oldValue = oldValue;
        _newValue = newValue;
    }

    public void Undo()
    {
        SetValue(_oldValue);
    }

    public void Redo()
    {
        SetValue(_newValue);
    }

    private void SetValue(object value)
    {
        // Set Value on the _target using reflection (_propertyName)
    }
}

ViewModel заботится о создании событий отмены, вызывая функции ViewModelBase:

class MyViewModel : ViewModelBase
{
    public string Name
    {
        get { return _model.Name; }

        // The SetValue will create a undo event, and push it to the UndoManager
        set { SetValue(_model, "Name", value); }
    }
}

Наконец, есть UndoManager (синглтон проекта), в котором хранятся стек отмены и стек повтора.

13
ответ дан 26 October 2019 в 10:46
поделиться

Я полагаю, вы связываете шаблон Command с Memento?

Я бы подумал, что система отмены будет как бы интегрирована в уровень ViewModel, поскольку это состояние пользовательского интерфейса.

?! Обычно отмена / возврат действует на бизнес-объекты, а пользовательский интерфейс отражает бизнес-уровень.

Допустим, у нас есть класс продукта со строкой «Описание». ProductVM предоставляет строковое свойство, которое вызывает PropertyChanged. При модификации сувенир сохраняет экземпляр старой модели. Если вы отмените действие, восстановите сувенир с помощью ProductVM.Description = (memento as Product) .Description: модель будет обновлена, и пользовательский интерфейс тоже.

NB: избегайте (memento as Product) , просто для образца;)

2
ответ дан 26 October 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: