ListBox(または他のItemsControl)を使用してCaliburnプレゼンターをホストする

StackOverflow https://stackoverflow.com/questions/1807630

質問

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プロパティのバインディング式を修正

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top