全局保存,检测和防止更改

本文关键字:保存 检测 全局 | 更新日期: 2023-09-27 18:18:45

我有选项卡应用程序,每个选项卡包含许多视图…在每个选项卡中,保存模式都是全局的。如果我留下包含更改的当前选项卡,将出现一个弹出窗口,询问用户是否保存或取消。保存后,其他打开的选项卡被重新加载。你怎么检测这些变化呢?只保存已更改的视图?然后将更改传播到其他选项卡?我的第一个想法是,在每个ViewModel中实现一个IsModified属性和ReloadTab方法,但不是真正可行的解决方案,每个setter必须改变这个属性…你知道吗?

class MyViewMode 
{
    ...
    public bool IsModified { get { return MyViewModel1.IsModified || MyViewModel2.IsModified ... || _isModified }
    ...
}
[编辑]

我在EventAggregator方法和Messenger (MVVM Light Toolkit实现)之间犹豫不决…

我想我要创建事件/消息域,代表每个命令生成一个标签重新加载,并创建一个处理程序(服务接收所有消息/事件,并发送特定的消息/事件,每个视图被重新加载)。有什么建议吗?

全局保存,检测和防止更改

我使用全局事件代理完成了此操作。其思想是,像save这样具有全局作用域的事件将通过这个代理类。

事件代理是一个单例,其中每个类将注册它的处理程序。处理程序将使用以下属性注册:

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

每个希望将自己推送到代理的对象将这样做:

EventBroker.Instance.Register(this);

这与你的标签问题有什么关系?很简单,当一个选项卡保存时,应该通过EventBroker触发save事件:

    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();
        }
    }

您仍然需要处理每个选项卡上保存的事件,可能在另一个选项卡完成某些操作时需要刷新,但这使代码相对美观和简单,而不必放入各种垃圾。也可以将它扩展到保存事件之外,创建一些其他可能有用的全局事件:

UserCreatedUserLoggedInSearchInitiated

不管;我不知道你的应用程序的上下文,但代理是一个很好的方式来处理在标签环境中共享知识。

请让我知道如果你想让我发送一些代码:)

最好的方法是修改每个setter。如果没有,您就不能确切地知道您的模型数据是否已经更改,我不建议在UI中跟踪修改后的更改。像这样的事情会给你一个好的开始。

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();
}