2013-02-02 49 views
2

我有一個WPF ListBox通過ItemsSource綁定到集合。 所選項目以雙向模式綁定到VM上的屬性。 我想要在UI中爲模型屬性指定一個值時,在UI上「未選定」所選項目。如何通過綁定來清除列表框的選定項目

這可能嗎?如果沒有,可以選擇清除選定的項目嗎?

請記住我正在使用MVVM模式,所以我沒有從代碼中訪問列表本身。

謝謝!

回答

3

我要去假定:

  1. 你的ListBox的ItemsSource屬性綁定到您的視圖模型(即VM_List)一些名單。
  2. 您的列表框的SelectedItem屬性綁定到您的ViewModel(即VM_SelectedItem)中的一些屬性與TwoWay綁定。

如果上述內容不準確,請詳細介紹一下您的實施情況。

您的視圖模型應該有一些代碼,看起來是這樣的:

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(); 
    } 
} 
+0

你所做的兩個假設是正確的。我忘記提及的是,我也使用vmselecteditem屬性用於其他目的。我需要它具有價值,即使它不是集合的一部分。感謝你的回答! – eyalhakim

+0

這很有趣...在這種情況下,將其設置爲空不是一個真正的選擇。您可能需要考慮將UI綁定到的第二個屬性,以便像「VM_SelectedItem_UI」屬性一樣「選擇項目」。當且僅當它是集合的一部分時,VM_SelectedItem_UI纔會更新VM_SelectedItem,反之亦然。我無法真正想到一個更好的方法來做到這一點。如果您需要澄清,我可以發佈一些代碼。 – Mash

+0

謝謝!我瞭解解決方案,但對於我的簡單要求來說聽起來有些複雜。也許在我的設計中有些東西是錯誤的,因爲我對mvvm缺乏經驗。 我有一個學生列表和一個學生數據模板綁定到一個選定的學生資產。當我選擇一個列表框項目時,它將被綁定到同一個選定的學生,然後根據新選擇的學生更改數據模板。在我的問題中的用例是當我想添加一個新的學生,然後我需要它是一個新的實例,顯然不是學生列表的一部分。 我錯過了什麼嗎? – eyalhakim

相關問題