我有两个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 ,但它不会帮助..
也许有人知道如何解决这个问题?
答案 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,因此您绑定到单个网格。