0

我有两个数据网格。您可以通过双击一行或多行来切换项目。双击事件由将选定项目列表发送到视图模型的命令处理。

所以我有带触发器的 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 AND Remove 命令。但是当我在两个委托命令方法中设置一个调试点时,它只输入一个。如果我只设置一个,不管是哪一个,它都会进入它。

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

我尝试应用SourceName甚至SourceObject但它无济于事..

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

4

1 回答 1

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

和 xml:

<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,所以你绑定到单个网格。

于 2012-07-11T11:45:16.140 回答