ОК, я построил полный макет вашей ситуации и предоставил весь код ниже.Все просто, так что, пожалуйста, все, пожалуйста, уменьшите количество плохих практик, которые я в нем заложил:)
Плохая новость заключается в том, что мой производный класс работает точно так же, как обычный DataGrid !Когда точка останова команды попадает в производную сетку, параметр имеет тот же тип TabControl.
Чтобы продолжить, мне нужно посмотреть, что еще вы можете делать (в дополнение к тому, что вы уже упомянули).Не стесняйтесь связаться со мной через мой сайт, если вы не хотите, чтобы ваш код был общедоступным.
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>
Код-позади:
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; }
}
}
Настраиваемая сетка данных:
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);
}
}
}