简体   繁体   English

Caliburn.micro,WPF和两个组合框

[英]Caliburn.micro, WPF and two comboboxes

I want to solve Master -> Detail problem with my Caliburn.Micro + wpf project. 我想用我的Caliburn.Micro + wpf项目解决Master-> Detail问题。

I have two comboboxes coded like this in TaskManagerView.xaml : 我在TaskManagerView.xaml中有两个这样编码的comboboxes

<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. 第一个Combobox ProjectsList正常,我可以得到想要的东西。 Second is a little complicated. 第二个有点复杂。 I get SelectedProjectList correctly (while im debuging on button i see what i choose). 我正确地获得了SelectedProjectList (同时在按钮上进行即时调试时,我看到了我所选择的)。 ProjectsList are the name of projects from new Project() class. ProjectsList是来自new Project()类的项目的名称。 In Project i store list of Task . 我在Project存储Task列表。 But when i want to fill TasksList , i get exception. 但是当我想填充TasksList ,出现异常。

Now, my TaskManagerViewModel : 现在,我的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? 我的问题是,代码帮助程序在哪里以及如何用于获取List<Task>'s名称? 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. 我知道我在这里做的不好,因为我在ViewModel的construcotr中做所有事情,但我想向你展示,我想做什么。

For now, i getting NullReferenceException , because SelectedProjectsList is null. 现在,我得到了NullReferenceException ,因为SelectedProjectsList为null。 How to rise up event on selected item from ComboBox ? 如何在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: 当然,如果我将VM编辑为这种形式:

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 我不想从第一个组合框中选择项目,单击按钮,然后从第二个组合框中选择项目

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. 由于这是MVVM,因此您的ViewModel不知道组合框或其事件,因此您无法直接订阅控件的事件。

When you select an item in projects list, it sets a value to SelectedProjectsList property, you can use this: 当您在项目列表中选择一个项目时,它会为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);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM