2010-02-11 124 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