如何通过XAML实例化对象?

时间:2014-09-05 21:08:46

标签: c# wpf entity-framework xaml mvvm

我正在使用MVVM模式和实体框架开发WPF应用程序。我写了一个包含一堆从数据库中填充的列表的类。这些列表用于填充ComboBoxes和其他`ItemsControls。

这是基本结构:

namespace MiniManager.ViewModel
{
    public class LookupLists
    {
        public LookupLists()
        {
            using (var db = new ModelContext())
            {
                Supervisors = db.Users.ToList().Where(u => u.Supervisor);
                // More lists...
            }
        }

        public IEnumerable<User> Supervisors { get; set; }
        // More lists...
    }
}

我在视图中使用这样的类:

<UserControl.Resources>
    <lists:LookupLists x:Key="LookupLists"/>
</UserControl.Resources>

当我需要在控件上使用它时,我绑定到资源中的属性:

<ComboBox ItemsSource="{Binding Source={StaticResource LookupLists},
                        Path=Supervisors}"/>

我的问题是:

  • LookupLists对象持续多长时间?
    • 只要用户界面处于活动状态?
    • 每次视图需要时,是否创建了LookupLists的新实例(因此查询了数据库)?

2 个答案:

答案 0 :(得分:3)

Resources中声明的项目将添加到FrameworkElement成员的特殊集合中。因此,只要控件执行,该集合就会存在。

除非控件被销毁,否则不会进行任何其他查询(除非您当然是这样做的。)

有关Resources媒体资源的更多信息,请参阅MSDN

答案 1 :(得分:2)

这取决于您声明资源的 where

其中:

  • 如果您将其声明为UserControl本地资源,那么它将主要由此对象引用,并且只要对象持续且 GC 无法收集内存

  • 如果您在App.xaml文件中将其声明为全局资源,那么它将在应用程序的整个生命周期内可用

如何:

  • 默认情况下,资源是共享,因此只创建一个实例并且每个引用都是如此,例如通过StaticResource,指向同一个唯一对象

  • 如果您将资源声明为x:Shared="False",那么每个引用都会触发生成新实例