2010-02-11 58 views
2

想象一下,我有一個用戶控件,顯示了一個停車場(我最喜歡的比喻)與不同顏色的汽車。您可以選擇一輛汽車,並在一個單獨的UserControl(在單獨的項目中)中顯示所選汽車的統計數據。ViewModel通信問題

現在用戶想要汽車統計信息UC上的按鈕'相同顏色的下一輛汽車'。選擇時,應顯示相同顏色的停車場上的下一輛車的統計數據(從上到下,從左到右)。

所以,如果這是有道理的問題。

我目前正在使用MVVM Lite將包含選定車輛的消息從停車場UC發送到汽車統計UC。一切都很好。現在,通過這個新功能請求,我該怎麼做?統計UC需要從停車場UC請求下一輛車。

這是一個使用依賴注入的好地方嗎?或者還有另一種更好的方法?

回答

1

如果我正確地得到你,你想要的是一個命令與正確的CommandParameters。

public class Car 
    { 
    public Car(ParkingLot lot) 
    { 
     _parkingLot = lot; 
    } 

    public string Color { get; set; } 

    public ParkingLot ParkingLot 
    { 
     get 
     { 
      return _parkingLot; 
     } 
    } 

    private ParkingLot _parkingLot; 
} 

public class ParkingLot : ObservableCollection<Car> 
{ 
    public Car SelectedCar { get; set; } 

    public ICommand ShowNextCarCommand { 
     get 
     { 
      if (_showNextCar == null) 
      { 
       _showNextCar = new DelegateCommand(OnShowNextCar); 
      } 

      return _showNextCar; 
     } 
    } 

    private void OnShowNextCar() 
    { 
     string currentColor = SelectedCar.Color; 
     //Write proper logic to get the next Car. Here you got the currently selected car with you and the color 
     SelectedCar = this.NEXT(s => s.Color == currentColor); //Write the NEXT() logic   
    } 

    ICommand _showNextCar; 
} 

現在是設置Button.Command =「{結合ParkingLot.ShowNextCarCommand}」現在你有你的控制權交給ParkingLot視圖模型類,並尋找下一個相同顏色的汽車,並把它再次SelectedCar的問題屬性。我假設你將在所有這些屬性中有RaisepropertyChanged。我使用簡單的棱鏡DelegateCommand

+0

這聽起來像個好主意!我會首先解決這個問題。我對命令很不好,我只是不知道我可以用他們做什麼和我不能做什麼。感謝這個偉大的例子。 – Nicros 2010-02-11 05:16:49

+0

我不明白你的Car類爲什麼要參考ParkingLot。看來,汽車只是真的需要知道它的顏色。由於ParkingLot基本上只是一個列表(可能應該是一個稀疏陣列?),只有它應該有責任知道哪輛車被選中,哪一輛是下一個。 – Dave 2010-02-11 05:19:56

+0

是的戴夫,我完全同意Car類對ParkingLot的認識不太好。但我想顯示調用另一個VM類命令的想法。無論如何,有一種更好的方法可以在XAML級別獲得ParkingLot dataContext。 – 2010-02-11 05:27:26

0

我會使用一個控制器作爲兩個ViewModels(ParkingLotViewModel和StatisticsViewModel)之間的中介。在你的情況下,控制器負責同步選定的汽車,並負責將'選擇下一輛同樣顏色的汽車'命令傳遞給ParkingLotViewModel。

WPF Application Framework (WAF)的示例應用程序顯示了這可以如何工作。

jbe