OnActivated()
実装を使用していると仮定してイベントをオーバーライドしIScreen
、そこにデータをロードするか、独自のロールを作成する場合はコンストラクターまたはカスタムInitialise
メソッドで (または誰かが既に言ったようにプロパティ アクセサーで) 行うことができます。
ユーザーに視覚的なコンテキストが必要な場合や、CM アクションとのより良い結びつきが必要な場合は、コルーチンを使用することもできます。
Loader
ここには、ユーザーに視覚的なコンテキストを提供するのに役立つクラスの簡単な実装があります。
https://caliburnmicro.codeplex.com/wikipage?title=IResult%20and%20Coroutines&referringTitle=ドキュメント
これはビジュアル ツリーでコントロールを検索BusyIndicator
し、コンテンツの読み込み中にそれをアクティブにします。
public class SomeViewModel : Screen
{
protected override void OnActivate()
{
RefreshData();
}
public void RefreshData()
{
Coroutine.BeginExecute(LoadData(), new ActionExecutionContext() { Target = this });
}
public IEnumerable<IResult> LoadData()
{
yield return Loader.Show("Loading Data...");
yield return new LoadSomeDataRoutine(client.GetDatas);
yield return Loader.Hide();
}
}
メソッドを持つ理由RefreshData
は、これにより CM アクションをバインドできるようになり、コルーチンがより多くのコンテキスト情報を取得できるようになるためです。
明らかに、WPF を使用しているため、Silverlight で得られる async->sync の利点について心配する必要はあまりありませんが (ただし、非同期 Web サービス呼び出しには依然として適用されます)、それでも多くの利点があり、再利用可能なルーチンを作成するのにも役立ちます。これはアプリケーション フレームワークの一部になります (たとえば、IResult
実装にカプセル化されたエラー処理/ロギングのレベルなど) 。
コンボボックスの入力についても言及しました... CM で行う必要があるのは、コントロールにコンボボックスを配置し、Name
そのプロパティを VM のプロパティの名前に設定することだけです。
public class SomeViewModel : Screen
{
public ObservableCollection<MyObject> MyProperty { //blah blah... }
}
<UserControl .... blah>
<ComboBox x:Name="MyProperty" />
</UserControl>
これにより、コンボボックスがアイテムで満たされます。SelectedItem
/のバインディングを設定する必要があります。SelectedValue
ただし、これはすでに知っていると思います-そうでない場合、CMには適切なドキュメントがあります:
https://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=ドキュメント