1

我有一个 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,并控制它们中的每一个的Visibility(一次只有一个可见)。

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

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

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

4

1 回答 1

0

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

此外,Visibility每当您的内容视图模型发生更改时,都会增加(微乎其微的)开销。DataTemplate由于您将 设置Content为 a ,因此将以任何一种方式评估ViewModel,并且 WPF 必须通过查找来确定如何绘制该 ViewModelDataTemplate

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

于 2013-03-21T14:36:08.030 回答