Caliburn.micro, WPF and two comboboxes

半城伤御伤魂 提交于 2020-01-06 12:44:04

问题


I want to solve Master -> Detail problem with my Caliburn.Micro + wpf project.

I have two comboboxes coded like this in TaskManagerView.xaml:

<ComboBox x:Name="ProjectsList" SelectedValuePath="{Binding Path=SelectedProjectsList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

<ComboBox x:Name="TasksList"/>

The first Combobox ProjectsList works ok, i can get what i want to. Second is a little complicated. I get SelectedProjectList correctly (while im debuging on button i see what i choose). ProjectsList are the name of projects from new Project() class. In Project i store list of Task. But when i want to fill TasksList, i get exception.

Now, my TaskManagerViewModel:

    class TaskManagerViewModel : Screen //constructor of ViewModel
    {
        public BindableCollection<string> ProjectsList { get; set; } //first CB
        public BindableCollection<string> TasksList { get; set; } //secondCB
        public string SelectedProjectsList { get; set; }//selected item from first combobox

        public TaskManagerViewModel(FakeData context) //constructor
        {
            this.context = context;
            //it works fine, i get Project.Name here from List<Project>
            ProjectsList = context.GetProjectsName();

            //i selected project name from combobox,
            //now i want to get tasks stored in List<Project> 
            //where SelectedProjectsList == Project.Name
            tasks = context.GetProjectsTasks(SelectedProjectsList); 
            foreach (Task task in tasks)
            {
                TasksList.Add(task.TaskName);
                NotifyOfPropertyChange(() => TasksList);
            }
        }


        public void CancelButton() => TryClose();

        private FakeData context;
        private List<Task> tasks;
    }

My question is, where and how code helper function for getting List<Task>'s names? I know that i done here is bad because i do everything in construcotr of ViewModel but i want to show u, what i want to do.

For now, i getting NullReferenceException, because SelectedProjectsList is null. How to rise up event on selected item from ComboBox? I choose project name and i immediately want to have tasks from choosen project (i know i can do it from button easily but its not what i want to achive)

Thanks for any advices!

Edit:

Of course if i edit VM to this form:

class TaskManagerViewModel : Screen
{
    public BindableCollection<string> ProjectsList { get; set; }
    public BindableCollection<string> TasksList{ get; set; }
    public string SelectedProjectsList { get; set; }

    public TaskManagerViewModel(FakeData context)
    {
        this.context = context;
        ProjectsList = context.GetProjectsName();
        TasksList = new BindableCollection<string>();
        //i moved initializing new combobox to AcceptButton()
    }

    public void AcceptButton()
    {
        //initializing tasks list on button click
        tasks = context.GetProjectsTasks(SelectedProjectsList);
        TasksList = new BindableCollection<string>();
        foreach (Task task in tasks)
        {
            TasksList.Add(task.TaskName);
            NotifyOfPropertyChange(() => TasksList);
        }
    }

    public void CancelButton() => TryClose();

    private FakeData context;
    private List<Task> tasks;
}

What i want to do is choose item from first combobox and immidietly tasks list in second shows up. I dont want to Choose item from first combobox, click on button and then choose item from second combobox

来源:https://stackoverflow.com/questions/53706176/caliburn-micro-wpf-and-two-comboboxes

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!