Silverlight InvokeCommandAction Bind Button DataContext To UserControl DataContext

By Robbe Morris

In Silverlight 4.0, you often times you need to bind to an ObservableCollection<T> in your ListBox, DataGrid, etc. but also bind to events/commands using InvokeCommandAction that exist in your ViewModel. It gives you a way to send the current record in the list as a parameter to method fired from your Button/Hyperlinkbutton click event. The following example shows how.

Here's a standard ListBox control.  The .DataContext of our main user control is bound to an instance
of our ViewModel class.  The ViewModel exposes a public command MoveCustomerCommand(Customer record).
The MoveCustomerCommand would be configured to use a DelegateCommand not shown here.
The ViewModel also exposes an ObservableCollection<Customer> called Customers that is used
as the ListBox.ItemSource value.

In the InvokeCommandAction tag, we set the path to use the DataContext of our ListBox control
named "CustomerListControl".  The CommandParameter="{Binding}" sets the value to the current
record in the collection/DataTemplate.

<ListBox Name="CustomerListControl" ItemsSource="{Binding Path=Customers,Mode=TwoWay}" >
<ListBox.ItemTemplate>
<DataTemplate>
    <HyperlinkButton>
      <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
          <i:InvokeCommandAction Command="{Binding Path=DataContext.MoveCustomerCommand,
                                                                           ElementName=CustomerListControl}"
       
                                               CommandParameter="{Binding}"/>
        </i:EventTrigger>
      </i:Interaction.Triggers>
     <HyperlinkButton.Content>
        <StackPanel Orientation="Horizontal">
           <TextBlock Text="{Binding Path=FirstName}"  />
           <TextBlock Text="{Binding Path=LastName}"  />
        </StackPanel>
      </HyperlinkButton.Content>
    </HyperlinkButton>
  </DataTemplate>
</ListBox.ItemTemplate>
</ListBox>


For more information on the DelegateCommand, here is a good example:

http://msmvps.com/blogs/deborahk/archive/2011/02/12/silverlight-simple-mvvm-commanding.aspx

Silverlight InvokeCommandAction Bind Button DataContext To UserControl DataContext  (2524 Views)