1

UserControl(MainView)があり、その中に別のUserControlを表示する必要があります。条件に応じて、AViewまたはBViewのいずれかが表示されます(どちらもMainViewの同じ場所に表示されます)。私はViewModelの最初のアプローチを使用しているので、ビューはデータテンプレートを介して生成されます。

public class AView : UserControl { }
public class BView : UserControl { }
public class AViewModel : ViewModelBase { }
public class BViewModel : ViewModelBase { }

リソース使用の観点から、これら2つのアプローチには違いがありますか。

1)ContentControlを1つ持つ

<ContentControl Content="{Binding SomeViewModel}" />

private ViewModelBase _someViewModel;
public ViewModelBase SomeViewModel
{
    get {return _someViewModel;}
    set
    {
        if (!ReferenceEquals(_someViewModel, value))
        {
            _someViewModel = value;
            RaisePropertyChange(SomeViewModel);
        }
    }
}

このようにして、SomeViewModelに設定するViewModel(AViewModelまたはBViewModel)を選択でき、DataTemplatesは表示する適切なビューを選択します。

2)2つのContentControlを配置し、それぞれの可視性を制御します(一度に1つだけが表示されます)。

<ContentControl Content="{Binding AViewModel}"
                Visibility="{Binding SomeCondition}" />

<ContentControl Content="{Binding BViewModel}"
                Visibility="{Binding NotSomeCondition}" />

したがって、リソース管理の観点から、これら2つのビューの切り替えは異なる動作をしますか、それともどちらの場合も、特定の時間に1つのビューのみがメモリに存在しますか?

4

1 に答える 1

0

WPFは、表示されていないオブジェクトをアンロードするため、常にビューの1つだけが両方のメソッドに読み込まれますが、2番目のメソッドはUIに2つのContentControlを作成し、最初のメソッドは1つだけを作成します。

さらに、Visibilityコンテンツビューモデルが変更されたときはいつでも評価するための追加の(ごくわずかな)オーバーヘッドがあります。をに設定しているためDataTemplate、はどちらの方法でも評価されます。WPFは、を探してそのViewModelを描画する方法を決定する必要があります。ContentViewModelDataTemplate

個人的には最初のバージョンが好きです。ContentControl特に、ビューが2つ以上あり、UIに一度に1つしか存在しない場合は、保守と管理が簡単になります。

于 2013-03-21T14:36:08.030 に答える