XAML 如何实例化对象?

3
我正在使用MVVM模式和Entity Framework开发一个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对象的生命周期有多长?
    • 只要UI处于活动状态?
    • 每次视图需要它时是否创建一个新的LookupLists实例(因此查询数据库)?
2个回答

3

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

除非销毁该控件,否则不会进行任何其他查询(当然,您也可以进行查询)。

有关存储这些内容的 Resources 属性的更多信息,请参见 MSDN


2

这取决于您在何处以及如何声明资源:

何处:

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

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

如何:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接