views:

87

answers:

1

This code works fine :

<sdk:DataGrid ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem,Mode=TwoWay}" x:Name="dataGrid">
    <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding CommandName}" CommandParameter="{Binding ElementName=MainTabControl,Mode=OneWay}"/>
            </i:EventTrigger>
    </i:Interaction.Triggers>

In my CustomDataGrid the Command executes but the CommandParameter is null :

<customControl:CustomDataGrid ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem,Mode=TwoWay}" x:Name="dataGrid">
    <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding CommandName}" CommandParameter="{Binding ElementName=MainTabControl,Mode=OneWay}"/>
            </i:EventTrigger>
    </i:Interaction.Triggers>

EDIT: My CustomDataGrid is driven from standard DataGrid and add an Event to it. it overrides two event: OnLoadingRow and OnUnLoadingRow.

Note that a simple CommandParameter e.g. a simple string was sent fine.

And MainTabControl is:

<sdk:TabControl Name="MainTabControl"> ...

What is the problem?

A: 

OK, I have built a complete mockup of your situation and provided all code below. Everything is bare-bones, so everyone please ease up on the number of bad practices I put in it :)

The bad new is, that my derived class works exactly the same as the normal DataGrid! When the command breakpoint is hit with the derived grid the parameter is exactly the same TabControl type.

To take this further I would need to see what else you may be doing (in addition what you have already mentioned). Feel free to contact me through my website if you do not want to make your code public.

View:

<UserControl xmlns:my="clr-namespace:SilverlightApplication4"  xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
    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:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
    x:Class="SilverlightApplication4.Page"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
        <Grid.RowDefinitions>
            <RowDefinition Height="59*" />
            <RowDefinition Height="241*" />
        </Grid.RowDefinitions>
        <sdk:TabControl x:Name="MainTabControl">
            <sdk:TabItem Header="Tab1">Tab 1 content</sdk:TabItem>
            <sdk:TabItem Header="Tab2">Tab 2 content</sdk:TabItem>
            <sdk:TabItem Header="Tab3">Tab 3 content</sdk:TabItem>
        </sdk:TabControl>
        <!--data:DataGrid Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" AutoGenerateColumns="True" ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" x:Name="dataGrid" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding CommandName}" CommandParameter="{Binding ElementName=MainTabControl,Mode=OneWay}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </data:DataGrid-->
        <my:CustomDataGrid Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" AutoGenerateColumns="True" ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" x:Name="dataGrid2" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding CommandName}" CommandParameter="{Binding ElementName=MainTabControl,Mode=OneWay}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </my:CustomDataGrid>
    </Grid>
</UserControl>

Code-behind:

using System.Windows.Controls;

namespace SilverlightApplication4
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
            this.DataContext = new ViewModel();
        }
    }
}

ViewModel:

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Controls;
using System.Windows.Input;
using Microsoft.Practices.Prism.Commands;

namespace SilverlightApplication4
{
    public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public ICommand CommandName { get; set; }
        public ObservableCollection<Item> MyItems { get; set; }

        public Item MySelectedItem { get; set; }

        public ViewModel()
        {
            MyItems = new ObservableCollection<Item>();
            MyItems.Add(new Item() { FirstName = "Joe", LastName = "Blogs" });
            MyItems.Add(new Item() { FirstName = "Another", LastName = "One" });
            MyItems.Add(new Item() { FirstName = "Jane", LastName = "Blogs" });
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("MyItems"));
            }
            CommandName = new DelegateCommand<TabControl>(OnCommandAction);
        }

        public void OnCommandAction(TabControl param)
        {
            // Breakpoint here
        }

    }

    public class Item
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

Custom datagrid:

using System.Windows.Controls;

namespace SilverlightApplication4
{
    public class CustomDataGrid : DataGrid
    {
        protected override void OnLoadingRow(DataGridRowEventArgs e)
        {
            base.OnLoadingRow(e);
        }

        protected override void OnUnloadingRow(DataGridRowEventArgs e)
        {
            base.OnUnloadingRow(e);
        }
    }
}
Enough already
Tried a complete mock-up, but it works fine. See updated answer. Will delete irrelevant comments too soon to clean up the post.
Enough already