全局保存,检测和防止更改
本文关键字:保存 检测 全局 | 更新日期: 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();
}