MVVM-我将如何在我的主视图模型(和其他视图模型)和我的设置对话框之间传播设置?

Posted

技术标签:

【中文标题】MVVM-我将如何在我的主视图模型(和其他视图模型)和我的设置对话框之间传播设置?【英文标题】:MVVM- How would I go about propagating settings between my main view-model (and other view-models) and my settings dialog? 【发布时间】:2011-02-11 23:52:59 【问题描述】:

我正在为我的应用程序构建一个设置对话框,现在所有设置都与主视图模型上的设置相对应,但随着我添加更多视图和视图模型,有些可能不会。

我需要知道将当前设置加载到设置对话框中的最佳做法是什么,然后如果用户单击确定,则将设置保存到相应的视图模型中。

我不会使用 Properties.Settings.Default 系统来存储设置,因为我希望我的应用程序尽可能便携,这会将用户范围的设置存储在目录中: C:\Users\ username \Local Settings\Application Data\ ApplicationName 而不是在我的应用程序的目录中。

如果有什么不同,我使用的是 Laurent Bugnion 的 MVVM Light Toolkit。

【问题讨论】:

【参考方案1】:

用工具包的 Messenger 来实现怎么样?

在设置 ViewModel 中进行更改时,您只需通知任何感兴趣的人:

Messenger.Send<Settings>(changedSettings);

所有需要知道设置是否已更改的 Viewmodel 都注册到该消息:

Messenger.Register<Settings>(this, delegate(Settings changedSettings)loadSettings(changedSettings););

在此处阅读:Mvvm light messenger 或查看此类似帖子 mvvm-light-how-to-access-property-in-other-view-model

【讨论】:

不要忘记检查接收者在委托中是否仍然有效。在关闭视图和下一次 GC 之间会有一段时间。在此时间段内,您仍会收到更改设置的消息,但视图已消失。 这是否解决了某些与主视图模型设置不对应的设置的需求?我认为这是对可扩展性的需求,这就是我建议使用 MEF 的原因。 Felan:每个注册设置类型消息的模型都会收到发送的设置。因此,您不仅限于主视图模型。但是您不会为不同的视图模型发送不同的设置。但是你也可以通过发送不同的设置类来做到这一点……我还没有仔细研究过 MEF,但它确实是一个解决方案。 :) 也许您应该展示一个量身定制的示例来阐明您的解决方案。 :) CodeWeasel:我有点忙不过来,可能在接下来的几周内,但当我有更多时间来摆弄它时,我会看到一个更好的定制示例。我认为贾斯汀问的主要问题是将来自其他模块的不同设置带入一个设置对话框。理想情况下,这不需要设置对话框来详细了解每个模块(理论上不同的用户甚至可以有不同的模块)。不过可能是我误会了。 我知道贾斯汀有一个设置对象,当它在全局设置视图中编辑时,他想与其他视图共享信息。这就是我建议信使的原因。但我想你也可以一起使用它们。 MEF 用于加载不同的设置类并在更新后使用信使传播它们。【参考方案2】:

您可以使用 MEF,从每个视图模型中导出设置视图,然后将它们作为视图列表导入到堆栈面板或主设置视图中的一些类似内容中。

使用 MEF 的一个很好的信息来源是:http://mef.codeplex.com/wikipage?title=Guide

这是一个我打算早点起床的示例程序:

使用系统; 使用 System.Collections.Generic; 使用 System.ComponentModel.Composition; 使用 System.ComponentModel.Composition.Hosting; 使用 System.Reflection;

namespace zTestConsole

    public interface ISimple
    
        string Message  get; 
    

    [Export("SimpleHello",typeof(ISimple))]
    public class SimpleHello : ISimple
    
        [Export("Message")]
        public string Message
        
            get  return "Silverlight rocks!"; 
        
    

    [Export("SimpleBello",typeof(ISimple))]
    public class SimpleBello : ISimple
    
        [Export("Message")]
        public string Message
        
            get  return "C# rocks!"; 
        
    

    public class SimpleMultiCat
    
        [ImportMany("Message")]
        public IEnumerable<string> Messages  get; set; 
    

    public class SimpleCat
    
        [Import("SimpleHello")]
        public ISimple simple  get; set; 
    

    class Program
    
        private static CompositionContainer container;

        static void Main(string[] args)
        

            AggregateCatalog catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));

            SimpleMultiCat cats = new SimpleMultiCat();
            SimpleCat cat = new SimpleCat();

            Program.container = new CompositionContainer(catalog);

            try
            
                Program.container.ComposeParts(cats);

                foreach (string message in cats.Messages)
                
                    Console.WriteLine(message);
                
            
            catch (CompositionException ex)
            
                Console.WriteLine(ex.ToString());
            

            Console.WriteLine();

            try
            
                container.ComposeParts(cat);
                Console.WriteLine(cat.simple.Message);
            
            catch (CompositionException ex)
            
                Console.WriteLine(ex.ToString());
            

        
    

【讨论】:

【参考方案3】:

我也遇到过这个问题。对我来说,解决方案是拥有类似 ISettingsService 模型的东西。将有2个实现。一种用于实际服务,一种用于设计时和单元测试的模拟。

这里有一个例子: http://compiledexperience.com/blog/posts/Blendable-MVVM-Dependency-Injection-and-Unit-Testing

【讨论】:

以上是关于MVVM-我将如何在我的主视图模型(和其他视图模型)和我的设置对话框之间传播设置?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 MVVM 从视图修改视图模型中的属性? [复制]

如何在以下 mvvm 架构中使用 @Binding Wrapper?

如何从 mvvm 中的视图模型关闭视图?

MVVM 中视图模型的交互

杜兰达尔/淘汰赛。更新其他视图/视图模型

将 [VisualStateManager] 视图状态绑定到 MVVM 视图模型?