ListBox(または他のItemsControl)を使用してCaliburnプレゼンターをホストする
-
05-07-2019 - |
質問
MultiPresenter
があり、 ListBox
を使用してホストしている Presenters
を表示している場合、Caliburnで検出するにはどうすればよいですかアイテムのビューとビューモデルをバインドしますか?
たとえば、次のような単純なビューがある場合:
<UserControl x:Class="MyProject.Views.CarView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<ListBox ItemsSource="{Binding Parts}" />
</Grid>
</UserControl>
CarViewModel
にバインドされている:
public class CarViewModel : MultiPresenter
{
public BindableCollection<IPartViewModel> Parts { get; }
}
そして Parts
コレクションには、 IPresenter
を実装し、対応するビューを持つさまざまなオブジェクトが含まれています。 WheelViewModel
および WheelView
、および EngineViewModel
および EngineView
。
ビュー戦略を使用して、Caliburnにビューを解決してもらいたい。これは可能ですか?この場合、プレゼンターの階層を正しく設定するには何をする必要がありますか?
解決
このためにプレゼンターの階層を変更する必要はありません。必要に応じて、 MultiPresenter.Presenters
プロパティを使用して子ViewModelsおよび MultiPresenter.Open
および MultiPresenter.Shutdown
メソッドを収集することを検討することをお勧めします。子ViewModelsライフサイクルを実施します。
バインディングの問題については、ListBoxアイテムのテンプレートを定義する必要があります。
<ListBox ItemsSource="{Binding Parts}">
<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl cal:View.Model="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
cal:View.Model
添付プロパティを使用して、フレームワークは各ViewModelに適切なビューを作成し、ViewModelにバインドしてContentControlに挿入します。
ViewsとViewModelsの名前空間とクラスの命名がCaliburn フレームワークによってビューが正しく推論されるようにする場合は、デフォルトの規則。そうでない場合は、カスタムIViewStrategyを作成する必要があります(ただし、難しくはありません)。
編集:cal:View.Modelプロパティのバインディング式を修正