2

ListBox経由でコレクションにバインドされた WPF がありItemsSourceます。選択したアイテムは、双方向モードで VM のプロパティにバインドされます。コレクションに存在しないモデル プロパティに値を割り当てるときに、選択した項目を UI で「選択解除」したいと考えています。

それは可能ですか?そうでない場合、選択したアイテムをクリアする代替手段はありますか?

私はMVVMパターンで作業しているため、コードからリスト自体にアクセスできないことに注意してください。

ありがとう!

4

1 に答える 1

3

私は次のことを前提としています。

  1. リストボックスの ItemsSource プロパティは、ViewModel のリスト (VM_List など) にバインドされています。
  2. リストボックスの 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();
    }
}
于 2013-02-02T21:51:56.043 に答える