2010-06-07 4 views
4

저는 MVVM과 Silverlight를 처음 접했고 간단한 시나리오를 찾으려고합니다.Silverlight Dataform 업데이트시 MVVM 명령 바인딩

Expression Blend없이 MVVM Light 툴킷과 Silverlight 3.0을 사용하고 있습니다.

나는 ViewModel에서 관찰 가능한 컬렉션에 바인딩 된 DataGrid와 DataForm을 가지고 있습니다. 내 RelayCommand Save() 속성에 바인딩하고 싶습니다. 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> 

그리고 내 뷰 모델은 다음과 같이 (사용하여 직접 실버 빠른 예를 들어 뷰 모델에서 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

관련 문제