级联组合框的热切加载

本文关键字:加载 组合 级联 | 更新日期: 2023-09-27 17:53:08

我有一个实体框架应用程序,其中客户和项目之间存在一对多关系。在级联组合框中访问数据。我最初使用的是懒惰加载,一切都正常。由于我现在必须序列化我的数据,我需要以另一种方式加载我的数据。我想使用热切加载,但我不确定如何在我的情况下实现它。在Projects属性中,我试图使用以下内容访问:

 var a = context.Customers.Include("Project");
            projects = (ObservableCollection<Project>)a;

但是我得到了一个转换类型错误。有人对我访问产品数据有什么建议吗?谢谢

public class ViewModel:INotifyPropertyChanged
{
    RevisionModelContainer context = new RevisionModelContainer();
    public ViewModel()
    {
        Customers = new ObservableCollection<Customer>();            
    }
 private ObservableCollection<Customer> customers;
    public ObservableCollection<Customer> Customers
    {
        get 
        {         
            return customers;            
        }            
        set
        {
            customers = value;
            OnPropertyChanged("Customers");               
        }
    }
    private ObservableCollection<Project> projects;
    public ObservableCollection<Project> Projects 
    {
        get
        {
            var a = context.Customers.Include("Project");
            projects = (ObservableCollection<Project>)a;
            return projects;             
        }
        set
        {
            projects = value;
            OnPropertyChanged("Projects");
        }
    }
 private Customer selectedCustomer;
    public Customer SelectedCustomer
    {
        get { return selectedCustomer; }
        set
        {
            try
            {
                selectedCustomer = value;
                OnPropertyChanged("SelectedCustomer");
                this.Projects = selectedCustomer.Projects;
                OnPropertyChanged("Projects");
            }
            catch (Exception ex) 
            {
                Debug.WriteLine("Seleceted Customer: " + ex.Message);
            }
        }
    }
    private Project selectedProject;
    public Project SelectedProject
    {
        get { return selectedProject; }
        set
        {
            try
            {
                selectedProject = value;
                OnPropertyChanged("SelectedProject");
                this.Programs = selectedProject.Programs;
                OnPropertyChanged("Programs");
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Selected Project: " + ex.Message);
            }
        }
    }

级联组合框的热切加载

您的"Projects"answers"Customers"属性的类型应分别为IEnumerable<Project>IEnumerable<Customer>。您不需要向ObservableCollection投射任何内容。您需要使用ObservableCollections的唯一时间是视图需要对集合更改的内容做出反应。在您的情况下,视图只需要知道Projects属性已更改为不同的项目列表。

我的意思是:

public class ViewModel : INotifyPropertyChanged
{
    RevisionModelContainer context = new RevisionModelContainer();
    public ViewModel() 
    {
        Customers = context.Customers.Include("Project");
    }
    public IEnumerable<Customer> Customers { get; private set; }
    public IEnumerable<Project> Projects { get; private set; }
    private Customer selectedCustomer;
    public Customer SelectedCustomer
    {
        get 
        { 
            return selectedCustomer; 
        }
        set
        {
            selectedCustomer = value;
            OnPropertyChanged("SelectedCustomer");
            // reset the projects.
            this.SelectedProject = null;
            this.Projects = selectedCustomer.Projects;
            OnPropertyChanged("Projects");
        }
    }
    private Project selectedProject;
    public Project SelectedProject
    {
        get 
        { 
            return selectedProject; 
        }
        set
        {
            selectedProject = value;
            OnPropertyChanged("SelectedProject");
        }
    }
}

根据我对你的用例的了解,这应该是可行的。如果您在视图模型中动态地添加从客户、项目或程序集合中删除项,则只需要可观察的集合,如下所示:Projects.Add(new Project());

如果你所做的只是分配像Projects = SelectedCustomer.Projects这样的属性,那么就不需要使用可观察的集合,只需要为你更新的属性引发propertychanged事件。