此代码可以正常工作:
<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>
在我的CustomDataGrid中,Command执行但CommandParameter为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>
修改
我的CustomDataGrid
来自标准DataGrid
,并为其添加了一个事件。它是override
两个event
:OnLoadingRow
和OnUnLoadingRow
。
请注意一个简单的CommandParameter
,例如一个简单的字符串被发送好了。
MainTabControl是:
<sdk:TabControl Name="MainTabControl"> ...
有什么问题?
答案 0 :(得分:0)
好的,我已经建立了一个完整的情况模型并提供了下面的所有代码。一切都很简陋,所以每个人都要放松我放入的不良做法的数量:)
坏消息是,我的派生类与普通的DataGrid完全相同!当使用派生网格命中命令断点时,该参数与TabControl类型完全相同。
为了更进一步,我需要看看你还在做什么(此外你已经提到过)。如果您不想公开您的代码,请随时通过我的网站与我联系。
<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();
}
}
}
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);
}
}
}