4

を持っていて、ホストしているを表示するためMultiPresenterに を使用している場合、Caliburn にアイテムのビューとビュー モデルを検出してバインドさせるにはどうすればよいですか?ListBoxPresenters

たとえば、次のような単純なビューがあるとします。

<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ます。WheelViewModelWheelViewEngineViewModelEngineView

ビュー戦略を使用して、Caliburn にビューを解決してもらいたいです。これは可能ですか?この場合、プレゼンターの階層を正しく設定するにはどうすればよいですか?

4

1 に答える 1

9

このためにプレゼンター階層を変更する必要はありません。子ViewModelのライフサイクルを適用する必要がある場合にのみ、プロパティを使用して子ViewModelとメソッドMultiPresenter.Presentersを収集することを検討することをお勧めします。MultiPresenter.OpenMultiPresenter.Shutdown

バインディングの問題については、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プロパティのバインディング式を修正しました

于 2009-11-27T14:21:49.183 に答える