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

时间:2011-12-26 13:31:12

标签: c# .net wpf mvvm

我有标签应用程序,每个标签包含许多视图......在每个标签中,保存模式是全局的。 如果我将当前选项卡包含更改,则会出现一个弹出窗口,询问用户是否使用保存或取消进行确认。保存后,重新加载其他打开的选项卡。 如何检测变化?仅保存更改的视图?然后将更改传播到其他选项卡? 我的第一个想法是,要在每个ViewModel中实现IsModified属性和ReloadTab方法,但不是真正可行的解决方案,每个setter都必须更改此属性......任何想法?

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

[编辑]

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

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

2 个答案:

答案 0 :(得分:1)

我使用全球事件经纪人完成了这项工作。这个想法是像具有全局范围的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();
        }
    }

当另一个选项卡完成某项操作时,您仍然需要处理可能需要刷新的每个选项卡上的已保存事件,但这样可以使代码保持相对简单和简单,而无需放置所有类型废话。也可以在保存事件之外扩展它,制作一些可能有用的其他全局事件:

UserCreated UserLoggedIn SearchInitiated

无论;我不知道你的应用程序的上下文 - 但是经纪人是一个非常好的方式来处理在选项卡式环境中分享知识。

如果您希望我发送一些代码,请告诉我们。)

答案 1 :(得分:0)

执行此操作的最佳方法是修改每个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();
}