C# XAML如何实例化对象?

C# XAML如何实例化对象?,c#,wpf,entity-framework,xaml,mvvm,C#,Wpf,Entity Framework,Xaml,Mvvm,我正在使用MVVM模式和实体框架开发一个WPF应用程序。我编写了一个类,其中包含一组从数据库填充的列表。这些列表用于填充组合框和其他`项控件 以下是基本结构: namespace MiniManager.ViewModel { public class LookupLists { public LookupLists() { using (var db = new ModelContext()) {

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

以下是基本结构:

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...
    }
}
namespace minimager.ViewModel
{
公共类LookupLists
{
公众形象提升者()
{
使用(var db=new ModelContext())
{
Supervisors=db.Users.ToList(),其中(u=>u.Supervisor);
//更多列表。。。
}
}
公共IEnumerable监视器{get;set;}
//更多列表。。。
}
}
我在视图中使用的类如下所示:

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

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

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

我的问题是:

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

参考资料
中声明的项目将添加到作为
框架元素
成员的特殊集合中。因此,集合的寿命将与控件的寿命一样长

除非控件被销毁,否则不会进行其他查询(当然,除非您进行了查询)


有关存储资源的
属性的更多信息,请参阅。

这取决于资源的存储位置和声明资源的方式:

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

  • 如果将其声明为
    UserControl
    本地资源,则该对象将主要引用该资源,并且只要该对象持续,并且GC不收集内存,该资源就会持续

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

如何:

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

  • 如果将资源声明为
    x:Shared=“False”
    ,则每个引用都将触发新实例的生成