我有标签应用程序,每个标签包含许多视图......在每个标签中,保存模式是全局的。 如果我将当前选项卡包含更改,则会出现一个弹出窗口,询问用户是否使用保存或取消进行确认。保存后,重新加载其他打开的选项卡。 如何检测变化?仅保存更改的视图?然后将更改传播到其他选项卡? 我的第一个想法是,要在每个ViewModel中实现IsModified属性和ReloadTab方法,但不是真正可行的解决方案,每个setter都必须更改此属性......任何想法?
class MyViewMode
{
...
public bool IsModified { get { return MyViewModel1.IsModified || MyViewModel2.IsModified ... || _isModified }
...
}
[编辑]
我在EventAggregator方法和Messenger(MVVM Light Toolkit实现)之间犹豫不决......
我想我将创建表示每个命令的事件/消息域生成选项卡重新加载,并创建一个处理程序(服务接收所有消息/事件并为每个要重新加载的视图发送特定消息/事件)。有什么建议吗?
答案 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();
}