Caliburn.micro, WPF и два комбинированных списка - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу решить проблему Master -> Detail с моим проектом Caliburn.Micro + wpf.

У меня есть два comboboxes, закодированные так в TaskManagerView.xaml :

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

<ComboBox x:Name="TasksList"/>

Первый Combobox ProjectsList работает нормально, я могу получить то, что хочу.Второе немного сложнее.Я получаю SelectedProjectList правильно (пока я отлаживаю кнопку, я вижу, что я выбираю).ProjectsList - это названия проектов из класса new Project()Project я храню список Task.Но когда я хочу заполнить TasksList, я получаю исключение.

Теперь мой 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;
    }

У меня вопрос, где и как функция помощника кодадля получения List<Task>'s имен?Я знаю, что я сделал здесь плохо, потому что я делаю все в construcotr ViewModel, но я хочу показать вам, что я хочу сделать.

Сейчас я получаю NullReferenceException, потому что SelectedProjectsList является нулевым,Как увеличить событие на выбранном элементе из ComboBox?Я выбираю название проекта и сразу хочу получить задачи из выбранного проекта (я знаю, что могу сделать это легко с помощью кнопки, но это не то, чего я хочу достичь)

Спасибо за любые советы!

Редактировать:

Конечно, если я отредактирую виртуальную машину для этой формы:

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;
}

Что я хочу сделать, это выбрать элемент из первого списка со списком задач и список задач в секундупоявляется.Я не хочу выбирать элемент из первого списка, нажмите на кнопку, а затем выберите элемент из второго списка

1 Ответ

0 голосов
/ 10 декабря 2018

Поскольку это MVVM, ваша ViewModel не знает о комбинированных окнах или их событиях, поэтому вы не можете напрямую подписаться на событие элемента управления.

Когда вы выбираете элемент в списке проектов, он устанавливаетзначение для свойства SelectedProjectsList, вы можете использовать это:

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);
    }
}
...