2011-07-28 22 views
3

我一直在試圖建立在WPF繼MVVM開發模式相當簡單的應用程序,但我已經準備在它看來多麼困難是做簡單的事情瘋狂。我已經在Forms中創建了這個應用程序,並且它已經成功運行,但是我的老闆要求我將WPF中的接口重寫爲該技術的演示。爲了使應用程序和代碼儘可能具有教育性,我決定儘量遵循儘可能多的最佳做法。我目前的困境是每次選擇更改時都使用一個列表框來運行一些代碼。我準備好使用帶事件的代碼隱藏來調用視圖模型上的方法。對我來說,這似乎仍然是MVVM,因爲沒有邏輯執行。感謝任何幫助/見解。有沒有簡單的方法將命令綁定到MVVM WPF中的列表框?

回答

2

你可以做列表框,簡單地結合selectedItem屬性...上選擇在視圖模型改變setter方法被調用,你可以做你想做什麼都...

這裏是一個示例這將幫助你

XAML

<Grid Canvas.Left="0" Canvas.Bottom="0" Height="300" Width="300" Background="Bisque"> 
      <ListBox ItemsSource="{Binding Employes}" SelectedItem="{Binding SelectedEmploye}"/> 
     </Grid> 

視圖模型

public class ViewModel : ViewModelBase 
    { 
     private List<Employee> _employes; 

     public List<Employee> Employes 
     { 
      get { return _employes; } 
      set { _employees = value; OnPropertyChanged("Employes"); } 
     } 
     private Employee _selectedEmploye; 

     public Employee SelectedEmploye 
     { 
      get { return _selectedEmploye; } 
      set 
      { 
       _selectedEmployee = value; 
       OnPropertyChanged("SelectedEmploye"); 
      } 
     } 

    } 

查看示範基地

public class ViewModelBase : INotifyPropertyChanged 
    { 
     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 
    } 

Employee類

public class Employee : ViewModelBase 
    { 
     private string _name; 
     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 
    } 
+0

這真的有助於指向正確的方向。謝謝。 – Paul

+0

這其實很好。但是當你不幸有一個很好的解決方案時,比如'Loaded'事件,你需要一些'EventToCommand'框架。 –

2

在您的視圖模型,你可以創建一個屬性 「的SelectedItem」。然後將SelectedItem屬性綁定到您的ListBox屬性中。

  • 如果它是POCO clr屬性(INotifyPropertyChanged),那麼您可以從屬性設置器中觸發您的代碼。
  • ,如果它是一個DependencyProperty,你必須添加一個PropertyChangedCallback,並從那裏觸發你的代碼。
1

不要害怕使用代碼隱藏。沒有代碼隱藏是避免在視圖中放置太多邏輯的指南,而不是一條硬性規則。在這種情況下(正如其他人所建議的那樣),您可以將SelectedItem屬性綁定到viewmodel上的某個屬性。對於與數據無關的事件,我的建議是正常處理事件,並將執行邏輯委託給視圖模型。

在我看來,設計模式應始終被視爲經驗法則,並與一些判斷使用,因爲它是很容易過於嚴格執行他們在不屬於他們,這通常使事情變得更糟的區域。

+0

我傾向於在這裏同意你的觀點,但幸運的是,看起來有一些更簡單的方法可以做到這一點,而不會跳過所有我認爲必須做的事情。 – Paul

+0

@ pauleck1 - 如果你覺得你不必要地跳過籃球,那麼現在是時候退後一步,重新考慮你是否採取了正確的做法。隨着所有MVVM框架的出現,很容易無望地過度設計事物並使代碼更難以維護(這有點失敗了)。不是說我在說MVVM是壞的,它當然是我使用WPF的首選武器。 – Moonshield

0

可以綁定到ListBox.SelectedItem讓你的虛擬機所選擇的項目。