我有一个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}" />
因此,从资源管理的角度来看,这两个视图之间的切换行为会有什么不同,或者在这两种情况下,在给定时间内只有一个视图会驻留在内存中吗?
答案 0 :(得分:0)
WPF卸载不可见的对象,因此在任何给定时间只会为两个方法加载一个视图,但是第二个方法将在UI中创建两个ContentControl,而第一个只创建一个。
此外,在内容视图模型发生更改时,评估Visibility
时会增加(微不足道)开销。由于您要将DataTemplate
设置为Content
,因此ViewModel
将进行评估,而WPF必须通过查找DataTemplate
<来确定如何绘制ViewModel / p>
我个人更喜欢第一个版本。它更易于维护和管理,尤其是当您有超过2个视图时,一次只有一个ContentControl
存在于