5

このようなコンテナビューがあります

<UserControl x:Class="Views.ContainerView">
    <UserControl.Resources>
        <ResourceDictionary>
            <DataTemplate DataType="{x:Type viewmodels:AViewModel}">
                <views:MyView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewmodels:BViewModel}">
                <views:MyView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewmodels:CViewModel}">
                <views:MyView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewmodels:DViewModel}">
                <views:MyView />
            </DataTemplate>
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding Path=AvailableViewModels}" 
            SelectedItem="{Binding Path=CurrentViewModel}" 
            IsSynchronizedWithCurrentItem="True" />
        <ContentControl Content="{Binding Path=CurrentViewModel}" />
    </Grid>
</UserControl>

私のすべてのビューモデルはBaseViewModelを継承しているので、ビューをこれに変えました

<UserControl x:Class="Views.ContainerView">
    <UserControl.Resources>
        <ResourceDictionary>
            <DataTemplate DataType="{x:Type viewmodels:BaseViewModel}">
                <views:MyView />
            </DataTemplate>
        </ResourceDictionary>
    </UserControl.Resources>
    <StackPanel>
        <ListBox ItemsSource="{Binding Path=AvailableViewModels}" 
            SelectedItem="{Binding Path=CurrentViewModel}" 
            IsSynchronizedWithCurrentItem="True" />
        <ContentControl Content="{Binding Path=CurrentViewModel}" />
    </StackPanel>
</UserControl>

1つのMyViewだけをインスタンス化し、ListBox.SelectedItemが変更されたときにビューモデルを再バインドすると考えています。この動作を正しく理解していますか?これは好ましい方法ですか?ビューを切り替えるときにメモリをかき回していないことを確認するにはどうすればよいですか?

4

2 に答える 2

2

Pavelの答えを拡張し、ビューモデルを変更したときにビューがどうなるかを明確にするために、新しいビューモデルに対して新しいビューが生成され、古いビューが時間内にガベージコレクションされることを期待しています。

これに伴う問題は、コードビハインドのイベント(弱いイベントではない)に登録されるビューがあり、これによりビューの収集が妨げられ、メモリリークが発生する場合があります。

2つのアプローチ。

  1. ビューコードビハインドのイベントサブスクリプションは、ガベージコレクションを許可するために弱める必要があります(PRISMのEventAggregator)。
  2. ビューのインスタンスをユニティコンテナに登録し、再利用する必要があるときに解決します。リージョンに挿入する前に、DataContextを更新するだけです。

お役に立てれば。

于 2010-11-11T00:51:33.083 に答える
1

使用するビューモデルごとに新しいMyViewがインスタンス化されます。ユーザーコントロールを再利用する場合は、各ユーザーコントロールにDataContextプロパティを設定できます。

于 2009-10-21T03:09:03.253 に答える