Caliburn.micro, WPF and two comboboxes

懵懂的女人 提交于 2020-01-06 12:44:17

问题


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


回答1:


As this is MVVM, your ViewModel does not know about combo boxes or their events, so you can't subscribe to the control's event directly.

When you select an item in projects list, it sets a value to SelectedProjectsList property, you can use this:

private string _selectedProjectsList;
public string SelectedProjectsList
{
    get
    {
        return _selectedProjectsList;
    }
    set
    {
        _selectedProjectsList = value;
        // project selection has been changed, populate your task list now!
        // upd: actual code for populating the list
        tasks = context.GetProjectsTasks(SelectedProjectsList);
        TasksList = new BindableCollection<string>();
        foreach (Task task in tasks)
        {
            TasksList.Add(task.TaskName);
        }
        NotifyOfPropertyChange(() => TasksList);
    }
}


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

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