问题
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