XAML 如何实例化对象

本文关键字:对象 实例化 XAML | 更新日期: 2023-09-27 18:21:00

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

以下是基本结构:

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的新实例(因此查询数据库(?

XAML 如何实例化对象

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

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

有关存储这些属性的 Resources 属性的详细信息,请参阅 MSDN。

这取决于您声明资源的位置方式

哪里:

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

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

如何:

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

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