2010-06-07 4 views
4

Je suis nouveau sur MVVM et Silverlight et j'essaie juste de trouver un scénario simple. J'utilise MVVM Light toolkit et Silverlight 3.0 sans Expression Blend.Liaison de commande Silverlight dataform MVVM sur la mise à jour

J'ai un DataGrid et un DataForm liés à une collection observable dans un ViewModel. Je voudrais lier à ma propriété RelayCommand Save() après avoir apporté des modifications aux données dans le contrôle DataForm et l'avoir fait sans utiliser le code derrière pour ma vue. Le DataForm n'utilise pas le cmd:ButtonBaseExtensions.Command que MVVM Light utilise pour la liaison normale de commandes par clic, donc je ne suis pas sûr de savoir comment lier le contrôle à mon ViewModel.

Toute aide est appréciée!

Répondre

7

Je l'ai compris peu de temps après avoir posté la question. Allez comprendre. Lorsque vous utilisez MVVM Light Toolkit, vous pouvez lier des événements à l'aide de la fonction EventToCommand.

Mon Xaml ressemble à ceci:

<UserControl x:Class="CountyBusinessDirectory.UI.MainPage" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
     xmlns:dataFormToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit" 
     xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
     xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight" 
     xmlns:cmdextras="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras" 
     DataContext="{Binding BusinessesViewModel, Source={StaticResource Locator}}"> 
<Grid x:Name="LayoutRoot" ShowGridLines="False"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="2*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <data:DataGrid x:Name="dgAllBusinesses" CanUserSortColumns="True" 
        IsReadOnly="True" AutoGenerateColumns="True" 
        ItemsSource="{Binding Businesses}" 
        Grid.Column="0"> 
    </data:DataGrid> 
    <ScrollViewer x:Name="svScroll" Grid.Column="1" > 
     <dataFormToolkit:DataForm x:Name="dfDetails" 
            ItemsSource="{Binding Businesses}" 
            AutoGenerateFields="True" 
            CommitButtonContent="Save" 
            CommandButtonsVisibility="Edit, Navigation, Commit, Cancel" > 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="EditEnded"> 
        <cmdextras:EventToCommand Command="{Binding SaveBusiness}" /> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </dataFormToolkit:DataForm> 
    </ScrollViewer> 
</Grid> 

Et mon ViewModel ressemble à ceci (en utilisant silverlight directe a permis un service WCF dans ViewModel par exemple rapide, normalement tirer ceci dans une interface à découpler) :

//using statements ommitted for brevity 

namespace MyProject.ViewModels 
{ 
    public class BusinessesViewModel : ViewModelBase 
    { 
     private PagedCollectionView _businesses; 
     DALServiceClient _proxy; 

     public RelayCommand SaveBusiness 
     { get; private set; } 

     public PagedCollectionView Businesses 
     { 
      get 
      { 
       return _businesses; 
      } 
      set 
      { 
       if (_businesses != value) 
       { 
        _businesses = value; 

        base.RaisePropertyChanged("Businesses"); 
       } 
      } 
     } 

     public BusinessesViewModel() 
     { 
      _proxy = new DALServiceClient(); //Data Access Layer WCF Service 

      _proxy.GetBusinessesCompleted += new EventHandler<GetBusinessesCompletedEventArgs>(_proxy_GetBusinessesCompleted); 
      _proxy.GetBusinessesAsync(); 

      SaveBusiness = new RelayCommand(() => SaveBusinessToDB()); 
     } 

     private void SaveBusinessToDB() 
     { 
      Business bus = Businesses.CurrentItem as Business; 
      _proxy.UpdateBusinessesAsync(bus); 
     } 

     void _proxy_GetBusinessesCompleted(object sender, GetBusinessesCompletedEventArgs e) 
     { 
      if (e.Result != null) 
      { 
       Businesses = new PagedCollectionView(e.Result); 
      } 
     } 
    } 
} 
+0

Votre message a été très utile. Merci. Veuillez le marquer comme réponse. – Shimmy

Questions connexes