Я создаю диалоговое окно настроек для своего приложения, и прямо сейчас все настройки соответствуют настройкам на основной модели представления, но поскольку я добавляю больше представления и модели представления, некоторые не могут.
Я должен знать то, что лучшая практика для загрузки текущих настроек в диалоговое окно настроек и затем сохранения настроек к их соответствующим моделям представления, если пользователь нажимает хорошо.
Я не буду использовать Свойства. Настройки. Система по умолчанию для хранения настроек, так как я хочу, чтобы мое приложение было максимально портативным и это сохранило бы ограниченные по объему настройки пользователя в каталоге: C:\Users\ username \Local Settings\Application Data\ ApplicationName
Вместо в каталоге моего приложения.
В случае, если это имеет любое значение, я использую Легкий Инструментарий MVVM Laurent Bugnion.
Как насчет реализации этого с помощью Messenger этого инструментария?
При внесении изменений в модель просмотра настроек вы просто информируете всех, кого это интересует:
Messenger.Send<Settings>(changedSettings);
И все модели просмотра, которым необходимо знать, были ли изменены настройки, регистрируются в этом сообщении:
Messenger.Register<Settings>(this, delegate(Settings changedSettings){loadSettings(changedSettings);});
Прочтите здесь: Mvvm light messenger или проверьте этот аналогичный пост mvvm-light-how-to-access -property-in-other-view-model
Вы можете использовать MEF, экспортируя представление настроек из каждой модели представления и импортируя их в виде списка представлений, которые вы добавляете в панель стека или что-то подобное в ваш основной вид настроек.
Хороший источник информации об использовании MEF: http://mef.codeplex.com/wikipage?title=Guide
Вот пример программы, которую я хотел начать раньше:
using System; с использованием 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());
}
}
}
}
У меня было это проблема тоже. Решение для меня заключалось в том, чтобы иметь что-то вроде модели ISettingsService. Было бы 2 реализации. Один для реального сервиса, а другой - имитация, который использовался для времени разработки и модульного тестирования.
Пример здесь: http://compiledexperience.com/blog/posts/Blendable-MVVM-Dependency-Injection-and-Unit-Testing