奇怪的交互触发行为

时间:2012-06-27 08:14:27

标签: wpf command interaction eventtrigger

我有两个Datagrids。您可以通过在一行或多行上进行Doubleclinking来在它之间切换项目。 doubleclick事件由将所选项列表发送到viewmodel的命令处理。

所以我有带触发器的Datagrid 1:

<i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDoubleClick" SourceName="lstProducts">
                    <cmd:EventToCommand Command="{Binding Path=Add}" 
                                        CommandParameter="{Binding ElementName=lstProducts, Path=SelectedItems}" />
                </i:EventTrigger>
</i:Interaction.Triggers>

和Datagrid 2触发器:

<i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDoubleClick"  SourceName="dgProducts">
                    <cmd:EventToCommand Command="{Binding Path=Remove}"
                                    CommandParameter="{Binding ElementName=dgProducts,Path=SelectedItems}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>

每次我双击一个Datagrid,它调用添加和删除命令。但是当我在两个委托命令方法中设置调试点时,它只输入一个。如果我只设置一个,无论哪一个,都会输入它。

例如,在第一个数据网格中单击它应该调用Add命令,因此它在断点处停止。但是当我将断点设置为删除时,但两者都没有。

我尝试应用 SourceName 甚至是 SourceObject ,但它不会帮助..

也许有人知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为我的方案正常运作:

public partial class MainWindow : Window
{
    public ObservableCollection<Product> Added { get; set; }

    public ObservableCollection<Product> Available { get; set; }

    public ICommand Add { get; set; }

    public ICommand Remove { get; set; }

    public MainWindow()
    {
        Added = new ObservableCollection<Product>();
        Available = new ObservableCollection<Product>();
        Available.Add(new Product { Id = 1 });
        Available.Add(new Product { Id = 2 });
        Available.Add(new Product { Id = 3 });
        Available.Add(new Product { Id = 4 });
        Available.Add(new Product { Id = 5 });
        InitializeComponent();
        DataContext = this;

        Add = new RelayCommand<IEnumerable>(x =>
        {
            foreach (Product item in x.Cast<Product>().ToArray())
            {
                Added.Add(item);
                Available.Remove(item);
            }

            Console.WriteLine("add");
        });

        Remove = new RelayCommand<IEnumerable>(x =>
        {
            foreach (Product item in x.Cast<Product>().ToArray())
            {
                Added.Remove(item);
                Available.Add(item);
            }
            Console.WriteLine("remove");
        });
    }
}

public class Product
{
    public int Id { get; set; }
}

和xaml:

<StackPanel >

    <DataGrid ItemsSource="{Binding Available}" SelectionUnit="FullRow" x:Name="lstProducts">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick" SourceName="lstProducts">
                <cmd:EventToCommand Command="{Binding Path=Add}"
                                    CommandParameter="{Binding ElementName=lstProducts, Path=SelectedItems}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

    </DataGrid>

    <DataGrid ItemsSource="{Binding Added}" SelectionUnit="FullRow" x:Name="lstProductsAdded" >
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick" SourceName="lstProductsAdded">
                <cmd:EventToCommand Command="{Binding Path=Remove}"
                                    CommandParameter="{Binding ElementName=lstProductsAdded, Path=SelectedItems}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

    </DataGrid>

</StackPanel>

这是你做过/想做的吗?在我的示例中,只执行一个命令。您可以在“输出”窗口中看到它。

我想出了如何破坏此代码以重现您的行为:在i:EventTrigger标记中,您具有相同的SoruceName,因此您绑定到单个网格。