【Prism】UserControl初期化時にViewModelのプロパティも設定する方法

What is this?

WPFでPrismフレームワークを使っている環境で、ItemsControlなんかの中で複数のカスタムUserControlをプロパティを変更しつつ生成したい場合、通常の状態だと生成元(親Windowなど)のViewModelでUserControlのViewModelを愚直にnewしてもプロパティが設定できないという事態に陥るので、その解決策です。

文章にするとややこしいですが、やろうとしていたのはこういうことです。

<ItemsControl ItemsSource="{Binding UserControls}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type vm:SampleUserControlViewModel}">
            <v:SampleUserControl />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
for (int i = 1; i < 21; i++)
{
    var uc = new SampleUserControlViewModel(_eventAggregator)
    {
        Message = string.Format("This is UserControl of No. {0}", i)
    };
    UserControls.Add(uc);
}

TL; DR

プロパティを手動で設定しようとしているUserControlのViewの AutoWireViewModelFalse にします。

<UserControl x:Class="PrismUserControlTest.Content.Views.SampleUserControl"
             ...
             prism:ViewModelLocator.AutoWireViewModel="False">

何が原因だったのか

すごく詳細に調査したというわけではないのですが、どうもここが True だとVMのインスタンスを持っていようといまいと問答無用でViewに紐付くVMが生成されるらしいのです。

その結果デバッガでブレークポイント張ってObservableCollectionの中身を見たら設定したプロパティでオブジェクトが存在するのに、なぜかViewに反映されないという事象として発現していたのではないかと推測されます。

サンプルソース

実験のために作ったソースをGitHubに上げておきます。

参考までにご覧いただければと想います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です