[英]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.