2011-05-22 99 views
2

我只是在使用MVVM Light框架的WP7開發者中嘗試我的手。ItemsControl中的MVVM Light命令

我想在一個ItemsControl中觸發一個按鈕命令,essentialy它是一個汽車列表,我希望每個元素都有一個編輯按鈕。 的相關一片視野:

<ItemsControl ItemsSource="{Binding MyCars}" > 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Grid x:Name="CarViewGrid"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" MinWidth="100" /> 
       <ColumnDefinition Width="Auto" MinWidth="302"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" MinHeight="40" /> 
       <RowDefinition Height="Auto" MinHeight="32" /> 
       <RowDefinition Height="Auto" MinHeight="32" /> 
       <RowDefinition Height="Auto" MinHeight="32" /> 
      </Grid.RowDefinitions> 
      <TextBlock x:Name="CarName" Text="{Binding Name, Mode=TwoWay}" Margin="7,0" Grid.Row="0" Grid.ColumnSpan="2" FontSize="32" FontWeight="Bold" FontStyle="Normal" /> 
      <TextBlock x:Name="Make" Text="{Binding Make, Mode=TwoWay}" Margin="15,0" Grid.Row="1" Grid.Column="0" FontSize="24" /> 
      <TextBlock x:Name="Model" Text="{Binding Model, Mode=TwoWay}" Grid.Row="1" Grid.Column="1" FontSize="24" /> 
      <TextBlock x:Name="Odometer" Text="{Binding Odometer, Mode=TwoWay}" Margin="15,0" Grid.Row="2" Grid.ColumnSpan="2" FontSize="24" /> 
      <Button x:Name="EditCarButton" Content="Edit" Grid.Row="3" Grid.Column="1" HorizontalAlignment="Right" Width="100" > 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="Click"> 
         <cmd:EventToCommand Command="{Binding EditCar}" CommandParameter="{Binding}"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </Button> 
     </Grid> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 

我的視圖模型包含此:

public RelayCommand OpenNewForm { get; private set; } 

    public CarViewModel() 
    { 
     //Snip 
     EditCar = new RelayCommand<Car>(c => 
     { 
      CurrentCar = c; 
      FormVisible = true; 
     }); 
    } 

現在你可以看到,我試圖傳遞的是通過結合當前Car對象CommandParameter。我的委託永遠不會觸發,所以我猜我的綁定關於當前的DataContext有問題。

有人有什麼想法,我做錯了什麼?

回答

1

它將在一個汽車項目上點燃EditCar。有幾種方法可以解決這個問題,since you're using mvvm light try

Laurent的信息。我發佈了錯誤的鏈接。我的意圖是,由於原始海報使用的是MVVM Light,所以Dan Wahlin's DataContextProxyRelativeSource binding解決方案將起作用。我打算繼續解釋如果使用CM從兒童項目的事件可能會起泡,但我沒有。與CM dotnetrocks的鏈接是我以前粘貼的東西。

+0

不知道如何告訴海報嘗試另一個框架將幫助他的MVVM Light的問題... – LBugnion 2011-05-22 07:33:53

+0

對不起,我的意圖不是固定的。 – 2011-05-22 13:22:51

+0

感謝您的支持和解釋,Derek,非常好的你:) – LBugnion 2011-05-22 16:01:45

7

在DataTemplate中,DataContext默認設置爲由DataTemplate(在這種情況下爲Car對象)表示的項目。如果EditCar命令位於主視圖模型(也包含MyCars集合)上,則需要顯式設置綁定的來源爲該對象。這將是(假設你正在使用的MVVM光的ViewModelLocator和您的VM名爲Main){綁定源= {靜態資源定位符},路徑= Main.EditCar}

乾杯, 洛朗

+0

在我的情況下,EditCar命令在CarViewModel上,它包含MyCars,它是一個ObservableCollection ,將ItemsControl綁定到該對象。 – GavinB 2011-05-22 21:00:07

+0

如果我正確理解Laurent,如果需要使用Command =「{Binding Source = {StaticResource Locator},Path = CarViewModel.EditCar}」來正確綁定該命令。 這是因爲目前我的Button有一個Car的上下文,並且試圖綁定到EditCar Command of Car – GavinB 2011-05-22 21:33:24

0

我有發現它更容易使我的收藏VM集合,而不是Entitycollections。我曾經使用實體集合,然後我開始遇到像你所描述的那些問題。但是現在集合中的每個VM都是'selfaware',並且可以在不跳過大環的情況下自行採取行動。

您可以將按鈕作爲CarsVM的一部分進行點擊,並且可以訪問carVM的所有屬性,這些屬性可以訪問車輛實體的所有屬性。從我的應用

樣品:

public partial class ReadmitPatientListViewModel : ViewModelBase 
    { 
     /// <summary> 
     /// Initializes a new instance of the ReadmitPatientListViewModel class. 
     /// </summary> 

     ////public override void Cleanup() 
     ////{ 
     //// // Clean own resources if needed 

     //// base.Cleanup(); 
     ////} 

     #region Declarations 

     ICommand _openSurveyCommand; 
     Messenger _messenger = Messenger.Default; 

     #endregion 

     #region Command Properties 
     public ICommand OpenSurveyCommand 
     { 
      get 
      { 
       if (_openSurveyCommand == null) 
       { 
        _openSurveyCommand = new RelayCommand(() => OnSurveyCommandExecute()); 
       } 
       return _openSurveyCommand; 
      } 
      private set { } 
     } 
     #endregion 

     #region Command Methods 
     private void OnSurveyCommandExecute() 
     { 
      Wait.Begin("Loading Patient List..."); 
      _messenger.Send<ReadmitPatientListViewModel>(this); 
      _messenger.Send<Messages.NavigationRequest<SubClasses.URI.PageURI>>(GetNavRequest_QUESTIONAIRRESHELL()); 

     } 
     #endregion 

     #region Properties 

     #endregion 


     private static Messages.NavigationRequest<SubClasses.URI.PageURI> GetNavRequest_QUESTIONAIRRESHELL() 
     { 
      Messages.NavigationRequest<SubClasses.URI.PageURI> navRequest = 
       new Messages.NavigationRequest<SubClasses.URI.PageURI>(
        new SubClasses.URI.PageURI(Helpers.PageLinks.QUESTIONAIRRESHELL, System.UriKind.Relative)); 
      return navRequest; 
     } 

     partial void OnCreated() 
     { 

     } 
    } 

這些都是在我的擴展結合主虛擬機的性能:

public CollectionViewSource SearchResultsCVS { get; private set; } 

     public ICollection<ViewModel.ReadmitPatientListViewModel> SearchResults { get; private set; } 

集合是爲CVS的索裏.....當點擊completeSurveyButton時,會發送一個導航請求,並將viewmodel的副本發送給任何監聽器進行操作。