0

MVVM RI と呼ばれる PRISM の例からコードをコピーしました。このファクトリ内にはDictionary<Type, Func<Question, QuestionViewModel>>for マッピングがあります。ここにあります:

    /// <summary>
    /// Factory class to create a question view model for a given question object.
    /// </summary>
    private static class QuestionViewModelFactory
    {
        private static Dictionary<Type, Func<Question, QuestionViewModel>> maps = new Dictionary<Type, Func<Question, QuestionViewModel>>()
        {
            { typeof(OpenQuestion), (q) => new OpenQuestionViewModel((OpenQuestion)q) },
            { typeof(MultipleSelectionQuestion), (q) => new MultipleSelectionQuestionViewModel((MultipleSelectionQuestion)q) },
            { typeof(NumericQuestion), (q) => new NumericQuestionViewModel((NumericQuestion)q) }
        };

        public static QuestionViewModel GetViewModelForQuestion(Question question)
        {
            Func<Question, QuestionViewModel> viewModelInstanceFactory = null;
            if (maps.TryGetValue(question.GetType(), out viewModelInstanceFactory))
            {
                return viewModelInstanceFactory(question);
            }
            else
            {
                throw new ArgumentOutOfRangeException("Could not locate a view model for question type");
            }
        }
    }

派生した各クラスでQuestionViewModelは、コンストラクター パラメーターを作成する必要があることに注意してください。

public abstract class QuestionViewModel : NotificationObject
{
    protected QuestionViewModel() { ... }
}

public abstract class QuestionViewModel<T> : QuestionViewModel
    where T : Question
{
    protected QuestionViewModel(T question) { ... }
}

しかし今、私はこのファクトリを発見する必要があります (参照がないため、これらは別のモジュールにあります)。最初は新しいカスタム アトリビュートを作成するようなことを考えていましたが、次のように言いました: どうすればパラメーターをコンストラクターに渡すことができますか?

同じデータ型の何百もの質問を作成するつもりです[Import]。それがうまくいかない理由です (私は推測します)。

4

1 に答える 1

0

を使用して調べることができますExportFactory<T>これは Silverlight に含まれており、WPF の場合はGlenn Block の Skydriveから Silverlight コードのポートをダウンロードできます。

を使用するExportFactoryと、特定のインポートされたタイプのオブジェクトを好きなだけ作成できます。

[ImportMany]
public IEnumerable<ExportFactory<IModule, IModuleMetadata>> Modules { get; set; }

次に、 のCreateExport()メソッドを呼び出してExportFactory、新しいオブジェクトをエクスポートできます。私は最近使用について知ったExportFactoryので、この投稿はあなたが始めるのに役立つかもしれません.

于 2012-09-12T22:13:20.117 に答える