MVVM - Как бы я распространил настройки между моей основной моделью представления (и другими моделями представления) и моим диалогом настроек? - PullRequest
5 голосов
/ 25 апреля 2010

Я создаю диалог настроек для своего приложения, и сейчас все настройки соответствуют настройкам основной модели вида, но, поскольку я добавляю больше видов и моделей видов, некоторые могут этого не делать.

Мне нужно знать, как лучше всего загружать текущие настройки в диалог настроек, а затем сохранять настройки на своих соответствующих моделях представления, если пользователь нажимает «ОК».

Я не буду использовать систему Properties.Settings.Default для хранения настроек, так как я хочу, чтобы мое приложение было максимально переносимым, и это сохранит настройки области пользователя в каталоге: C:\Users\ username \Local Settings\Application Data\ ApplicationName Вместо в каталоге моего приложения.

На случай, если что-то изменится, я использую MVVM Light Toolkit от Laurent Bugnion.

Ответы [ 3 ]

3 голосов
/ 26 апреля 2010

Как насчет реализации этого с помощью Messenger из набора инструментов?

Когда вносятся изменения в Настройки ViewModel, вы просто информируете всех, кого интересует:

Messenger.Send<Settings>(changedSettings);

И все Viewmodels, которым необходимо знать, были ли изменены настройки, регистрируются в этом сообщении:

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

Прочитайте здесь: Mvvm light messenger или проверьте этот же пост mvvm-light-how-to-access-property-in-other-view-model

1 голос
/ 29 апреля 2010

У меня тоже была эта проблема.Решением для меня было иметь что-то вроде модели ISettingsService.Было бы 2 реализации.Один для реального сервиса, а другой - для издевательства, который использовался для разработки и тестирования модулей.

Пример здесь: http://compiledexperience.com/blog/posts/Blendable-MVVM-Dependency-Injection-and-Unit-Testing

1 голос
/ 25 апреля 2010

Вы можете использовать MEF, экспортируя представление настроек из каждой модели представления и импортируя их в виде списка представлений, которые вы добавляете на панель стека или некоторые из них в представлении основных настроек.

Хороший источник информации об использовании MEF: http://mef.codeplex.com/wikipage?title=Guide

Вот пример программы, которую я хотел встать раньше:

с использованием Системы; using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using 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());
            }

        }
    }
}
...