This is a migrated thread and some comments may be shown as answers.
commanding inside RowDetailsTemplate
1 Answer 39 Views
This is a migrated thread and some comments may be shown as answers.
cielo valdoz
Top achievements
Rank 1
cielo valdoz asked on 13 May 2011, 10:00 AM
How can i fire the event of a button if its inside the RowDetailsTemplate of RadGridView?
Currently, im using a RelayCommand to call the event but its not firing.
Any ideas?

XAML
<telerik:RadGridView.RowDetailsTemplate>
               <DataTemplate>
                   <Grid>
                       <Grid.RowDefinitions>
                           <RowDefinition />
                           <RowDefinition />
                       </Grid.RowDefinitions>
                       <telerik:RadTabControl HorizontalAlignment="Left" Height="Auto" Margin="15" VerticalAlignment="Top" Width="Auto" Background="{StaticResource shinywhite_fill}" Style="{StaticResource SVG_RadTabControlStyle}" BorderBrush="#FFC2C2C2">
                           <telerik:RadTabItem Header="Details" Height="30" Style="{StaticResource SVG_RadTabItemStyle}" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0,0,2,0" FontFamily="/Recipe;component/Fonts/Fonts.zip#Myriad Web Pro" FontSize="12" FontWeight="Bold" Foreground="{x:Null}">
                               <my:DetailsView NewList="False" />
                           </telerik:RadTabItem>
                           <telerik:RadTabItem Header="Keywords" Height="30" Style="{StaticResource SVG_RadTabItemStyle}" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0,0,2,0" FontFamily="/Recipe;component/Fonts/Fonts.zip#Myriad Web Pro" FontSize="12" FontWeight="Bold">
                               <my:KeywordsView NewList="False" />
                           </telerik:RadTabItem>
                           <telerik:RadTabItem Header="Picture" Height="30" Style="{StaticResource SVG_RadTabItemStyle}" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0,0,2,0" FontFamily="/Recipe;component/Fonts/Fonts.zip#Myriad Web Pro" FontSize="12" FontWeight="Bold" Foreground="{x:Null}">
                               <my:PictureView NewList="False" />
                           </telerik:RadTabItem>
                           <telerik:RadTabItem Header="Ingredients" Height="30" Style="{StaticResource SVG_RadTabItemStyle}" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0,0,2,0" FontFamily="/Recipe;component/Fonts/Fonts.zip#Myriad Web Pro" FontSize="12" FontWeight="Bold">
                               <my:IngredientsView NewList="False" />
                           </telerik:RadTabItem>
                           <telerik:RadTabItem Header="Calculation" Height="30" Style="{StaticResource SVG_RadTabItemStyle}" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0,0,2,0" FontFamily="/Recipe;component/Fonts/Fonts.zip#Myriad Web Pro" FontSize="12" FontWeight="Bold">
                               <my:CalculationView NewList="False" />
                           </telerik:RadTabItem>
                           <telerik:RadTabItem Header="Procedure" Height="30" Style="{StaticResource SVG_RadTabItemStyle}" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0,0,2,0" FontFamily="/Recipe;component/Fonts/Fonts.zip#Myriad Web Pro" FontSize="12" FontWeight="Bold">
                               <my:ProcedureView NewList="False" />
                           </telerik:RadTabItem>
                           <telerik:RadTabItem Header="HACCP" Height="30" Style="{StaticResource SVG_RadTabItemStyle}" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0,0,2,0" FontFamily="/Recipe;component/Fonts/Fonts.zip#Myriad Web Pro" FontSize="12" FontWeight="Bold">
                               <my:HACCPView NewList="False" />
                           </telerik:RadTabItem>
                           <telerik:RadTabItem Header="Translation" Height="30" Style="{StaticResource SVG_RadTabItemStyle}" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0,0,2,0" FontFamily="/Recipe;component/Fonts/Fonts.zip#Myriad Web Pro" FontSize="12" FontWeight="Bold">
                               <my:TranslationView NewList="False" />
                           </telerik:RadTabItem>
                       </telerik:RadTabControl>
                       <Button Content="Save Changes" Grid.Row="1" Name="btnSave" Command="{Binding Path=SaveDetailsCommand}" Height="25" Margin="5" Style="{StaticResource SVG_Button}" HorizontalAlignment="Right" VerticalAlignment="Bottom" Foreground="{x:Null}" BorderBrush="{x:Null}" Background="{x:Null}" Cursor="Hand"/>
                   </Grid>
               </DataTemplate>
           </telerik:RadGridView.RowDetailsTemplate>

VIEWMODEL
Namespace ViewModels
    Public Class RecipeListViewModel
        Inherits NotificationObject
  
        Public WithEvents webService As New IwcfServiceClient
        Private m_dataService As IwcfServiceClient
  
        Public Sub New(ByVal intCodeSetPrice As Integer, ByVal intCodeType As Integer, ByVal intCodeUser As Integer)
            PageSize = 100
            m_dataService = New IwcfServiceClient
            IsBusy = True
  
            AddHandler m_dataService.GetRecipeListCompleted, AddressOf webService_GetRecipeListCompleted
            m_dataService.GetRecipeListAsync(intCodeSetPrice, intCodeType, intCodeUser)
  
            ' Initialize the commands.
            SaveDetailsCommand = New RelayCommand(AddressOf SaveRecipeDetails)
            CancelDetailsCommand = New RelayCommand(AddressOf CancelRecipeDetails)
  
  
        End Sub
  
        Public Sub New()
            m_dataService = New IwcfServiceClient
  
            AddHandler m_dataService.GetUsersListCompleted, AddressOf webService_GetUsersListCompleted
            m_dataService.GetUsersListAsync()
  
        End Sub
  
  
  
#Region "Property"
  
        Private m_usersList As ObservableCollection(Of UsersListDataItem)
        Public Property UsersList() As ObservableCollection(Of UsersListDataItem)
            Get
                Return m_usersList
            End Get
            Private Set(ByVal value As ObservableCollection(Of UsersListDataItem))
                m_usersList = value
                Me.RaisePropertyChanged("UsersList")
            End Set
        End Property
  
        Private m_recipeList As ObservableCollection(Of RecipeListDataItem)
        Private _items As PagedCollectionView = Nothing
        Public ReadOnly Property RecipeList() As PagedCollectionView
            Get
                'If _items Is Nothing Then
                '    _items = New PagedCollectionView(m_recipeList)
                'End If
                Return _items
                Me.RaisePropertyChanged("RecipeList")
            End Get
        End Property
  
        Private m_isBusy As Boolean
        Public Property IsBusy() As Boolean
            Get
                Return m_isBusy
            End Get
            Private Set(ByVal value As Boolean)
                m_isBusy = value
                Me.RaisePropertyChanged("IsBusy")
            End Set
        End Property
  
        Private m_isEditMode As Visibility
        Public Property IsEditMode() As Visibility
            Get
                Return m_isEditMode
            End Get
            Set(ByVal value As Visibility)
                m_isEditMode = value
                Me.RaisePropertyChanged("IsEditMode")
            End Set
        End Property
  
        Private _PageSize As Integer
        Public Property PageSize As Integer
            Get
                Return _PageSize
            End Get
            Set(ByVal value As Integer)
                _PageSize = value
                Me.RaisePropertyChanged("PageSize")
            End Set
        End Property
  
#End Region
  
#Region "Commands"
  
        Private m_saveDetailsCommand As ICommand
        Public Property SaveDetailsCommand() As ICommand
            Get
                Return m_saveDetailsCommand
            End Get
            Set(ByVal value As ICommand)
                m_saveDetailsCommand = value
                Me.RaisePropertyChanged("SaveDetailsCommand")
            End Set
        End Property
  
        Private m_canceDetailsCommand As ICommand
        Public Property CancelDetailsCommand() As ICommand
            Get
                Return m_canceDetailsCommand
            End Get
            Set(ByVal value As ICommand)
                m_canceDetailsCommand = value
                Me.RaisePropertyChanged("CancelDetailsCommand")
            End Set
        End Property
  
  
        Public Sub SaveRecipeDetails()
            'NOT FIRING ON THIS SUB
        End Sub
  
        Public Sub CancelRecipeDetails()
            'NOT FIRING ON THIS SUB
        End Sub
  
#End Region
  
#Region "Webservice"
  
        Private Sub webService_GetRecipeListCompleted(ByVal sender As Object, ByVal e As CalcmenuService.GetRecipeListCompletedEventArgs) Handles webService.GetRecipeListCompleted
            If Not e.Result Is Nothing And e.Result.Count <> 0 Then
                m_recipeList = e.Result
                _items = New PagedCollectionView(m_recipeList)
                Me.RaisePropertyChanged("RecipeList")
                IsBusy = False
            End If
        End Sub
  
        Private Sub webService_GetUsersListCompleted(ByVal sender As Object, ByVal e As CalcmenuService.GetUsersListCompletedEventArgs) Handles webService.GetUsersListCompleted
            If Not e.Result Is Nothing Then
                UsersList = e.Result
                Me.RaisePropertyChanged("UsersList")
            End If
        End Sub
  
        Private Sub webService_SaveMerchandiseDetailsCompleted(ByVal sender As Object, ByVal e As CalcmenuService.SaveMerchandiseDetailsCompletedEventArgs) Handles webService.SaveMerchandiseDetailsCompleted
            IsEditMode = Visibility.Collapsed
        End Sub
#End Region
  
    End Class
  
  
    Public Class RelayCommand
        Implements ICommand
  
        ReadOnly _execute As Action(Of Object)
        ReadOnly _canExecute As Predicate(Of Object)
  
        Private _action As System.Action
  
        Public Sub New(ByVal execute As Action(Of Object))
            Me.New(execute, Nothing)
        End Sub
  
        Public Sub New(ByVal execute As Action(Of Object), ByVal canExecute As Predicate(Of Object))
            If execute Is Nothing Then
                Throw New ArgumentNullException("execute")
            End If
  
            _execute = execute
            _canExecute = canExecute
        End Sub
  
        Public Function CanExecute(ByVal parameter As Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute
            Return If(_canExecute Is Nothing, True, _canExecute(parameter))
        End Function
        Public Event CanExecuteChanged(ByVal sender As Object, ByVal e As System.EventArgs) Implements System.Windows.Input.ICommand.CanExecuteChanged
  
        Public Sub Execute(ByVal parameter As Object) Implements System.Windows.Input.ICommand.Execute
            _execute(parameter)
        End Sub
  
    End Class
  
  
End Namespace

I saw on some forums that i should define ViewModel as a resource in xaml but this line returns error (Cannot create an instance of RecipeListViewModel)

 

 

 

<UserControl.Resources>

 

 

 

 

    <viewmodel:RecipeListViewModel x:Key="CommandViewModel" />

 

 

 

 

</UserControl.Resources>

 


Then add a Source to the Command

Command

 

 

="{Binding Path=SaveDetailsCommand, Source={StaticResource CommandViewModel}}"

So my work around is to call the event from code-behind when the gridview was expanded. But im not sure if this solution is good enough. I want to learn on how to use Icommand on Silverlight as i know i can use this function later on.

Private Sub RadGridItems_LoadingRowDetails(ByVal sender As Object, ByVal e As Telerik.Windows.Controls.GridView.GridViewRowDetailsEventArgs) Handles RadGridItems.LoadingRowDetails
       Dim btnSave As Button
       btnSave = DirectCast(e.DetailsElement.FindName("btnSave"), Button)
       AddHandler btnSave.Click, AddressOf SaveChanges
   End Sub
   Private Sub SaveChanges()
       Dim viewModel As RecipeListViewModel = New RecipeListViewModel()
       viewModel.SaveRecipeDetails()
   End Sub


1 Answer, 1 is accepted

Sort by
0
cielo valdoz
Top achievements
Rank 1
answered on 13 May 2011, 10:32 AM
After playing some codes, i found a solution! I should define another ViewModel for that commanding so the event will fire on.
<UserControl.Resources>
    <viewmodel:CommandingViewModel x:Key="CommandViewModel" />
</UserControl.Resources>

<Button Content="Save Changes" Grid.Row="1" Name="btnSave" Command="{Binding Path=SaveDetailsCommand, Source={StaticResource CommandViewModel}}" Height="25" Margin="5" Style="{StaticResource SVG_Button}" HorizontalAlignment="Right" VerticalAlignment="Bottom" Foreground="{x:Null}" BorderBrush="{x:Null}" Background="{x:Null}" Cursor="Hand"/>


ViewModel

Public Class CommandingViewModel
        Public Sub New()
            ' Initialize the commands.
            SaveDetailsCommand = New RelayCommand(AddressOf SaveRecipeDetails)
            CancelDetailsCommand = New RelayCommand(AddressOf CancelRecipeDetails)
        End Sub
  
#Region "Commands"
  
        Private m_saveDetailsCommand As ICommand
        Public Property SaveDetailsCommand() As ICommand
            Get
                Return m_saveDetailsCommand
            End Get
            Set(ByVal value As ICommand)
                m_saveDetailsCommand = value
                'Me.RaisePropertyChanged("SaveDetailsCommand")
            End Set
        End Property
  
        Private m_canceDetailsCommand As ICommand
        Public Property CancelDetailsCommand() As ICommand
            Get
                Return m_canceDetailsCommand
            End Get
            Set(ByVal value As ICommand)
                m_canceDetailsCommand = value
                'Me.RaisePropertyChanged("CancelDetailsCommand")
            End Set
        End Property
  
  
        Public Sub SaveRecipeDetails()
            'NOT FIRING ON THIS SUB
        End Sub
  
        Public Sub CancelRecipeDetails()
            'NOT FIRING ON THIS SUB
        End Sub
  
#End Region
    End Class

This might be helpful for others who encountered same problem.
Asked by
cielo valdoz
Top achievements
Rank 1
Answers by
cielo valdoz
Top achievements
Rank 1
Share this question
or