Глобальное сохранение, обнаружение и предотвращение изменений - PullRequest
1 голос
/ 26 декабря 2011

У меня есть приложение вкладок, каждая вкладка содержит много представлений ... И в каждой вкладке режим сохранения является глобальным. Если я покидаю текущую вкладку, содержащую изменения, появляется всплывающее окно с запросом подтверждения пользователя с сохранением или отменой или без нее. После сохранения другие открытые вкладки перезагружаются. Как бы вы сделали, чтобы обнаружить изменения? Чтобы сохранить только просмотры изменились? А потом распространять изменения на другие вкладки? Первое, что я думаю, - реализовать свойство IsModified и метод ReloadTab в каждой модели ViewModel, но это нереальное решение, каждый установщик должен изменить это свойство ... Есть идеи?

class MyViewMode 
{
    ...
    public bool IsModified { get { return MyViewModel1.IsModified || MyViewModel2.IsModified ... || _isModified }
    ...
}

[EDIT]

Я сомневаюсь между подходом EventAggregator и Messenger (реализация MVVM Light Toolkit) ...

Я думаю, что собираюсь создать домен событий / сообщений, представляющий каждую команду, генерирующую перезагрузку вкладки, и создать обработчик (служба получает все сообщения / события и отправляет определенные сообщения / события для каждого перезагружаемого представления). Любые советы?

Ответы [ 2 ]

1 голос
/ 26 декабря 2011

Я сделал это с помощью глобального брокера событий.Идея состоит в том, что такие события, как save, которые имеют глобальную область действия, будут проходить через этот класс посредника.

Посредник событий - это одноэлементный объект, в котором каждый класс регистрирует свои обработчики.Обработчик будет зарегистрирован с использованием атрибутов:

[EventSubscribe(EventNames.Save)]
private void OnSaved(GlobalEventArgs args)
{
    // do something on saved
}

И каждый объект, который хочет передать себя брокеру, будет делать это так:

EventBroker.Instance.Register(this);

Как это относится к вашим вкладкамвопрос?Проще говоря, когда одна вкладка сохраняется, то это должно вызвать событие save через EventBroker:

    EventBroker.Instance.Publish(
        EventNames.Save, 
        new SavedGlobalEventArgs(typeof(YourModel)));

И все остальные ваши вкладки будут обрабатывать событие, такое как это:

    [EventSubscribe(EventNames.Save)]
    private void OnSaved(GlobalEventArgs args)
    {
        var savedArgs = (SavedGlobalEventArgs)args;

        if(savedArgs.SavedType == typeof(YourModel)
        {
             this.Model.Refresh();
        }
    }

Вам все равно придется обрабатывать сохраненное событие на каждой вкладке, которое может потребовать обновления, когда другая вкладка что-то сделала, но это делает код относительно приятным и простым без необходимости помещатьвсе виды вбросов. Можно также расширить его вне события сохранения, сделать некоторые другие глобальные события, которые могут быть полезны:

UserCreated UserLoggedIn SearchInitiated

что угодно;Я не знаю контекст вашего приложения, но брокер - это действительно хороший способ обмена знаниями в среде с вкладками.

Пожалуйста, дайте мне знать, если вы хотите, чтобы я отправил некоторый код:)

0 голосов
/ 26 декабря 2011

Лучший способ сделать это - изменить каждый сеттер. Если нет, вы не можете точно знать, изменились ли данные вашей модели, и я бы не советовал отслеживать измененные изменения в пользовательском интерфейсе. Нечто подобное должно дать вам хороший старт.

public class Person : IModifiable
{
    private bool _markDirty;

    private string _Name;
    public string Name
    {
        get { return _Name; }
        set
        {
            if (value != _Name)
                _markDirty = true;
            _Name = value;
        }
    }

    public bool IsDirty()
    {
        return _markDirty;
    }
}

public interface IModifiable
{
    public bool IsDirty();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...