私は次のことを前提としています。
- リストボックスの ItemsSource プロパティは、ViewModel のリスト (VM_List など) にバインドされています。
- リストボックスの SelectedItem プロパティは、TwoWay バインディングを使用して ViewModel (VM_SelectedItem など) のプロパティにバインドされます。
上記が正確でない場合は、実装についてもう少し情報を提供してください。
ビューモデルには、次のようなコードが必要です。
public class VM : INotifyPropertyChanged
{
private ObservableCollection<Student> vmlist = new ObservableCollection<Student>();
private Student vmselecteditem;
public event PropertyChangedEventHandler PropertyChanged;
public VM()
{
PropertyChanged = new PropertyChangedEventHandler(VM_PropertyChanged);
}
private void VM_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
}
public ObservableCollection<Student> VM_List
{
get
{
return vmlist;
}
}
public Student VM_SelectedItem
{
get
{
return vmselecteditem;
}
set
{
vmselecteditem = value;
}
}
public void AddNewStudent(Student NewStudent)
{
VM_SelectedItem = null;
PropertyChanged(this, new PropertyChangedEventArgs("VM_SelectedItem"));
VM_SelectedItem = NewStudent;
SaveStudent();
PropertyChanged(this, new PropertyChangedEventArgs("VM_SelectedItem"));
//The last line is optional, if you want to select the new student just added.
}
private void SaveStudent()
{
//A fake operation to save the student.
//To stick with MVVM, the save function should be in the model
//And this function should just call the one in the model.
BackgroundWorker b = new BackgroundWorker();
b.DoWork += new DoWorkEventHandler(b_DoWork);
b.RunWorkerCompleted += new RunWorkerCompletedEventHandler(b_RunWorkerCompleted);
b.RunWorkerAsync();
}
private void AddStudentToList()
{
VM_List.Add(VM_SelectedItem);
}
private void b_DoWork(object sender, DoWorkEventArgs e)
{
//Simulating a long save operation
System.Threading.Thread.Sleep(2000);
}
private void b_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
AddStudentToList();
}
}