2

現在カテルを勉強中。

Catel.Examples の PersonApplication (具体的には PersonWindow.xaml) では、設計時のデータが Visual Studio Designer 内に表示されません。

PersonViewModel のコードでは、パブリック プロパティがコメント アウトされています。どうやらこれは、コードが Fody を使用して実行時に Model プロパティを作成しているためです。そのため、Visual Studio デザイナでデザイナにデザインタイム データを表示するにはパブリック プロパティが必要であると想定して、パブリック プロパティのコメントを外しました。それでも、DesignPersonViewModel のデザイン時のデータはデザイナーに表示されません。

アプリケーションは実行時に正しく実行されます。XAML またはコード内の問題を示すビルドに関するメッセージはありません。デザインタイム データ コンテキストを宣言する XAML コードは正しいです。

d:DataContext="{d:DesignInstance ViewModels:DesignPersonViewModel,
                                 IsDesignTimeCreatable=True}"

designtime データが Designer に表示されない理由について何か説明はありますか?

Visual Studio 2015 を使用しています。

4

2 に答える 2

1

Catel のフレームワークに対する私の強い感謝にもかかわらず、私はこの奇妙な動作も目撃しました。

依存プロパティが [Model] 装飾プロパティに接続されていないようです。ただし、修正する必要がありますが、依存関係プロパティを直接設定することで回避できます。

public PersonViewModel(Person person) // this approach works
{
    // Person = person ?? new Person();
    // The following 2 lines provide DesignTime data
    SetValue("FirstName", "Joe");
    SetValue("LastName", "Dalton");
    GenerateData = new Command<object, object>(OnGenerateDataExecute, OnGenerateDataCanExecute);
    ToggleCustomError = new Command<object>(OnToggleCustomErrorExecute);
}

public PersonViewModel(Person person) // this approach does not work
{
    // Person = person ?? new Person();
    Person = new Person() { FirstName = "Joe", LastName = "Dalton" };
    GenerateData = new Command<object, object>(OnGenerateDataExecute, OnGenerateDataCanExecute);
    ToggleCustomError = new Command<object>(OnToggleCustomErrorExecute);
}
于 2016-12-06T23:22:22.560 に答える
1

2 番目の例では、ビュー モデルがさらに多くのロジック (モデルからビュー モデルへのマッピング) を呼び出す必要があります。その理由は、デザイン タイム ビュー モデルがデザイン タイムにモデル マッピングを自動的に行うことを期待しているためです。実装できたとしても、あまり意味がありません。

設計時のビュー モデルは、デザイナー内にダミー データを表示するためだけに、非常に軽量でシンプルなビュー モデルにする必要があります。デザイナーの速度が低下し、例外が発生した場合にデザイナーがクラッシュする可能性があるため、実行時に完全に機能するビュー モデルとして動作するべきではありません。

頭のてっぺんから、デザイナーで実行しているかどうかをチェックし、実行している場合はかなりのロジックをスキップします。

これはバグのように見えますが、設計時のビュー モデルはシンプルで軽量でなければならないため、仕様によるものです。設計目的で、非常に単純なものを作成し、ViewModelLocator に命名規則を追加することをお勧めします。例えば:

if (CatelEnvironment.IsInDesignMode)
{
    var viewModelLocator = ServiceLocator.Default.ResolveType<IViewModelLocator>();
    viewModelLocator.NamingConventions.Insert(0, "[UP].ViewModels.[VW]DesignTimeViewModel")
}

これにより、アプリはデザイン モードで MyPersonDesignTimeViewModel を優先することができますが、アプリの実行中には実際のビュー モデルが読み込まれます。

これは、デザイン時にビューが実際にビュー モデルを解決しようとする場合にのみ機能することに注意してください。

于 2016-12-07T10:21:53.770 に答える