在CustomDataGrid的Command中,Command Parameter为null

时间:2010-09-16 06:52:57

标签: silverlight xaml mvvm datagrid command

此代码可以正常工作:

<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两个eventOnLoadingRowOnUnLoadingRow

请注意一个简单的CommandParameter,例如一个简单的字符串被发送好了。

MainTabControl是:

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

有什么问题?

1 个答案:

答案 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);
        }
    }
}