Параметр команды является нулевым в команде CustomDataGrid - PullRequest
1 голос
/ 16 сентября 2010

Этот код отлично работает:

<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 команда выполняется, но значение CommandParameter равно нулю:

<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: Мой CustomDataGrid управляется из стандартного DataGrid и добавляет к нему событие. это override с двумя event: OnLoadingRow и OnUnLoadingRow.

Обратите внимание, что простой CommandParameter например. простая строка была отправлена ​​в порядке.

И MainTabControl это:

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

В чем проблема?

1 Ответ

0 голосов
/ 16 сентября 2010

ОК, я построил полный макет вашей ситуации и предоставил весь код ниже.Все просто, так что, пожалуйста, все, пожалуйста, уменьшите количество плохих практик, которые я в нем заложил:)

Плохая новость заключается в том, что мой производный класс работает точно так же, как обычный 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);
        }
    }
}
...