5

アプリケーションの設定ダイアログを作成しています。現在、すべての設定はメインのビューモデルの設定に対応していますが、ビューとビューモデルを追加すると、一部の設定が対応しない場合があります。

現在の設定を設定ダイアログにロードし、ユーザーが[OK]をクリックした場合に、対応するビューモデルに設定を保存するためのベストプラクティスを知る必要があります。

アプリケーションを可能な限り移植可能にしたいので、Properties.Settings.Defaultシステムを使用して設定を保存しません。これにより、ユーザースコープの設定が C:\Users\ username \Local Settings\Application Data\ ApplicationName アプリケーションのディレクトリではなくディレクトリに保存されます。

違いが生じる場合は、LaurentBugnionのMVVMLightToolkitを使用しています。

4

3 に答える 3

3

ツールキットのメッセンジャーでそれを実装するのはどうですか?

Settings ViewModelで変更が行われると、関心のある人に通知するだけです。

Messenger.Send<Settings>(changedSettings);

そして、設定が変更されたかどうかを知る必要があるすべてのViewmodelは、そのメッセージに登録されます。

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

ここを読んでください:Mvvmライトメッセンジャーまたはこの同様の投稿を確認してくださいmvvm-light-how-to-access-property-in-other-view-model

于 2010-04-26T14:26:43.073 に答える
1

私もこの問題を抱えています。私にとっての解決策は、ISettingsServiceモデルのようなものを用意することでした。2つの実装があります。1つは実際のサービス用で、もう1つは設計時と単体テストに使用されたモックです。

ここでの例:http: //compiledexperience.com/blog/posts/Blendable-MVVM-Dependency-Injection-and-Unit-Testing

于 2010-04-29T16:36:34.927 に答える
1

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());
            }

        }
    }
}
于 2010-04-25T00:22:11.260 に答える