2010-06-07 110 views
4

我是MVVM和Silverlight的新手,我只是想弄清楚一個簡單的場景。Silverlight dataform MVVM命令綁定更新

我正在使用MVVM Light工具包和Silverlight 3.0,而無需使用Expression Blend。

我有一個DataGrid和DataForm綁定到ViewModel中的可觀察集合。在對DataForm控件中的數據進行更改後,我想綁定到我的​​屬性,並在不使用代碼的情況下完成此操作。

DataForm沒有使用MVVM Light用於正常按鈕單擊命令綁定的cmd:ButtonBaseExtensions.Command,所以我不確定如何將控件綁定到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> 

我的視圖模型看起來像這樣(使用直接啓用Silverlight的WCF服務視圖模型進行簡單的例子,通常會拉成一個接口此去耦) :

//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 2012-01-09 00:01:45