2012-06-27 40 views
0

我有兩個Datagrids。您可以通過Doubleclinking在一行或多行之間切換它之間的項目。 doubleclick事件由將選定項列表發送到視圖模型的命令處理。奇怪的交互觸發行爲

所以我有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和刪除命令。但是,當我在兩個委託命令方法中設置一個調試點時,它只輸入一個。如果我只將它設置爲一個,不管哪一個,它都會進入它。

例如在第一個數據網格中點擊它應該調用添加命令,所以它停在斷點處。但是當我設置要移除的斷點時,而不是兩者。

我試圖以應用SOURCENAME甚至SourceObject,但它不會幫助..

也許有人知道如何解決這一問題?

+0

沒有人知道解決方案嗎? –

+0

我不明白的一部分「每次我雙擊它調用添加和刪除命令的Datagrid。」直到這一行,我認爲你有一些「選擇許多形式集控制」。但在這種情況下,每次雙擊都只會調用一個處理程序。 – Rafal

+0

我爲每個調用不同命令的Datagrid添加了一個MouseDoubleClick觸發器。所以當我點擊第一個DataGrid時,它只應該調用Add Command,並且第二次只應該調用Remove命令。但它稱之爲兩者。 –

回答

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> 

這是你做了什麼/想做的事?在我的示例中,只執行一條命令。你可以在Output窗口看到它。

我想出瞭如何分解這段代碼來重現你的行爲:在這兩個i:EventTrigger標記中,你都有相同的SoruceName,所以你綁定到單個網格。

+0

嘿,謝謝你的回答。看來你真的想幫我解決我的問題:) 這幾乎是我的代碼激動人心的再現。 SourceName不一樣,一個是lstProducts,一個是dgProducts。 當我在添加中設置斷點時,它會進入添加,甚至點擊刪除,反之亦然。但是,當我設置兩個斷點時,它只會輸入一個....非常奇怪...... –

+0

嘗試運行我的代碼並查看會發生什麼情況:)也許您會看到不同之處,或者它會按照您在環境中描述的方式工作。這意味着我們有不同的mvvmlight dll。請注意,我今天下載了這個項目(4.0.23.1)。 – Rafal