2010-12-09 59 views
5

我在datagrid的第一列有按鈕。我正在使用MVVM並試圖將命令綁定到ViewModel中的命令,但是當我單擊每行中的按鈕時,它不起作用(它不會在ViewModel中調用Command),但如果我將該按鈕從DataGrid中移出,它將正常工作。如何從silverlight和MVVM中的datagrid中的按鈕觸發事件

如何從MVVM中的datagrid中的按鈕觸發事件?

更新1:

XAML代碼是:

<datagrid:DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" 
         VerticalAlignment="Center"> 
      <Button x:Name="button" Content="View" Margin="5" DataContext="{StaticResource XDataContext}"> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="Click"> 
         <i:InvokeCommandAction Command="{Binding ViewOrganizationCommand}" 
               CommandParameter="{Binding ElementName=dtgOrganizations, Path=SelectedItem}" /> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </Button> 
     </StackPanel> 
    </DataTemplate> 
</datagrid:DataGridTemplateColumn.CellTemplate> 

視圖模型的代碼是:

public ViewModelCommand ViewOrganizationCommand { get; set; } 
+0

看着你的xaml和虛擬機代碼將會很有幫助。請添加它。 – 2010-12-27 08:59:44

回答

1

而不是使用EventTrigger,爲什麼不直接綁定到按鈕。直接命令,像這樣?

<Button 
    ...other properties... 
    Command="{Binding ViewOrganizationsCommand}" 
    CommandParameter="{Binding}"/> 

將結合命令,以及CommandParameter設置爲按鈕的DataContext的,這大概是對參數綁定到一個好東西。如果不是,只需將CommandParameter綁定到其他可幫助您唯一標識所點擊的特定行的其他東西。

0

該命令使用事件觸發看起來很好結合(這是我怎麼總是做), 但我懷疑,你的命令是從來沒有分配給(你正在使用自動屬性) 我通常不喜歡這樣:

private ViewModelCommand viewOrganizationCommand; 

public ViewModelCommand ViewOrganizationCommand 
     { 
     get 
     { 
      if (viewOrganizationCommand == null) 
       viewOrganizationCommand = new ViewModelCommand(Action, CanDoIt); 
      return viewOrganizationCommand; 
     } 
     } 
0

嘗試設置您的Button的DataContext到StackPanel並設置Button的Command和CommandParameter。

<datagrid:DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" 
         VerticalAlignment="Center" DataContext="{StaticResource XDataContext}"> 
      <Button x:Name="button" Content="View" Margin="5" Command="{Binding ViewOrganizationCommand}" CommandParameter="{Binding ElementName=dtgOrganizations, Path=SelectedItem}" > 
      </Button> 
     </StackPanel> 
    </DataTemplate> 
</datagrid:DataGridTemplateColumn.CellTemplate> 
0

DataGrid的每一行都將其DataContext設置爲該對象。如果網格的ItemSource是ObservableCollection,則每行的DataContext都是組織對象。

有兩種處理方法。

  1. 創建公開該命令的包裝或擴展ViewModel。那麼命令應該會觸發。這裏有一些僞代碼。

    public class OrganizationExtensionViewModel 
    { 
        <summary> 
        /// Private currentOrginization property. 
        /// </summary>   
        private Organization currentOrginization; 
    
        public Organization CurrentOrganization 
        { 
         get 
         { 
          return this.currentOrginization; 
         } 
    
         set 
         { 
          if (this.currentOrginization != value) 
          { 
           this.currentOrginization = value; 
           this.RaisePropertyChanged("CurrentOrganization"); 
          } 
         } 
        } 
    
        public ViewModelCommand ViewOrganizationCommand { get; set; } 
        public OrganizationExtensionViewModel(Organization o) 
        { 
         this.CurrentOrganization = o; 
         this.ViewOrganizationCommand = new ViewModelCommand(this.ViewOrgnaizationClicked); 
        } 
    } 
    
  2. 定義視圖模型在XAML作爲StaticResource的,並且是指它作爲結合路徑。

... 在網格

<Button x:Name="button" Content="View" Margin="5" Command="{Binding ViewOrganizationCommand, Source={StaticResource viewModel}}" /> 
1

This article帶來了DataContextProxy的解決方案。應用此解決方案可以編寫一個按鈕代碼,如Austin Lamb的答案。

相關問題