2010-06-07 4 views
4

Я новичок в MVVM и Silverlight, и я просто пытаюсь выяснить простой сценарий.Silverlight dataform MVVM привязка команды к обновлению

Я использую инструментарий MVVM Light и Silverlight 3.0 без Expression Blend.

У меня есть DataGrid и DataForm, привязанные к наблюдаемой коллекции в ViewModel. Я хотел бы привязаться к свойству RelayCommand Save() после внесения изменений в данные в элементе управления DataForm и добиться этого без использования кода для моего представления.

В DataForm не используется cmd:ButtonBaseExtensions.Command, что MVVM Light использует для нормального нажатия кнопки, так что я не уверен, как связать элемент управления с моей ViewModel.

Любая помощь приветствуется!

ответ

7

Я понял, что вскоре после размещения вопроса. Идите фигуру.

При использовании инструмента MVVM Light Toolkit вы можете связываться с событиями, используя функцию EventToCommand.

Мой Xaml выглядит следующим образом:

<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> 

И мой ViewModel выглядит следующим образом (с использованием прямой Silverlight включен службы WCF в ViewModel для быстрого примера, как правило, тянуть это в интерфейс разъединить) :

//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

Ваше сообщение было очень полезным. Благодарю. Пожалуйста, отметьте это как ответ. – Shimmy

Смежные вопросы