CustomDataGrid命令中命令参数为空

发布于 2024-09-24 07:07:03 字数 1444 浏览 0 评论 0原文

这段代码工作正常:

<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 为 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 驱动,并向其中添加一个事件。它覆盖两个事件OnLoadingRowOnUnLoadingRow

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

而MainTabControl是:

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

有什么问题吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

墨小沫ゞ 2024-10-01 07:07:03

好的,我已经为您的情况构建了完整的模型,并提供了下面的所有代码。一切都是简单的,所以每个人都请减少我在其中放入的不良做法的数量:)

坏消息是,我的派生类与普通 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();
        }
    }
}

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

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);
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文