使用ContentControl生成视图(UserControls)

时间:2013-03-21 14:31:07

标签: wpf mvvm wpf-controls

我有一个UserControl(MainView)需要在其自身内显示另一个UserControl。根据某些条件,它将显示AView或BView(它们都出现在MainView中的相同位置)。我正在使用ViewModel的第一种方法,因此视图是通过数据模板生成的:

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

从资源使用角度来看,这两种方法之间存在差异:

1)有一个ContentControl

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

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

这样我可以选择将哪个ViewModel(AViewModel或BViewModel)设置为SomeViewModel,DataTemplates将选择要显示的相应视图。

2)放置两个ContentControl,并控制每个ContentControl的可见性(一次只能看到一个)。

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

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

因此,从资源管理的角度来看,这两个视图之间的切换行为会有什么不同,或者在这两种情况下,在给定时间内只有一个视图会驻留在内存中吗?

1 个答案:

答案 0 :(得分:0)

WPF卸载不可见的对象,因此在任何给定时间只会为两个方法加载一个视图,但是第二个方法将在UI中创建两个ContentControl,而第一个只创建一个。

此外,在内容视图模型发生更改时,评估Visibility时会增加(微不足道)开销。由于您要将DataTemplate设置为Content,因此ViewModel将进行评估,而WPF必须通过查找DataTemplate <来确定如何绘制ViewModel / p>

我个人更喜欢第一个版本。它更易于维护和管理,尤其是当您有超过2个视图时,一次只有一个ContentControl存在于