2012-06-27 6 views
0

두 개의 Datagrid가 있습니다. 하나 이상의 행을 두 번 클릭하여 두 항목 사이에서 항목을 전환 할 수 있습니다. doubleclick 이벤트는 선택된 항목 목록을 viewmodel로 보내는 명령에 의해 처리됩니다. 이상한 상호 작용 방아쇠 행동

그래서 내가 트리거에서 Datagrid 일이 있습니다

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

매번 그것을 추가를 호출하여 데이터 그리드를 클릭하여 명령을 제거합니다. 하지만 두 Delegate Command 메쏘드 안에서 debug Point를 설정하면 하나만 입력됩니다. 내가 그것을 하나만 설정하면 어느 것에 관계없이 그것을 입력 할 것입니다.

예를 들어 첫 번째 DataGrid를 클릭하면 Add Command가 호출되어 중단 점에서 중단됩니다. 하지만 제거 할 중단 점을 설정할 때도 있지만 둘 다 설정할 수는 없습니다.

은 내가 여기서 SourceName 심지어 SourceObject을 적용하는 시도했지만 늘

어쩌면 사람이 어떻게 해결 알고 .. 도움?

+0

아무도 해결책을 모릅니다. –

+0

"내가 추가 및 제거 명령을 호출하는 Datagrid를 두 번 클릭 할 때마다"부분을 이해할 수 없습니다. 이 줄이 생길 때까지는 "선택 컨트롤을 많이 선택하십시오"라고 생각했습니다. 그러나이 경우 각 더블 클릭에 대해 하나의 핸들러 만 호출됩니다. – Rafal

+0

다른 명령을 호출하는 각 Datagrid에 대해 MouseDoubleClick Trigger를 추가했습니다. 따라서 첫 번째 DataGrid를 클릭하면 Add Command 만 호출해야하고 두 번째 DataGrid에서는 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> 

이 당신이/한 싶었던 무엇인가? 내 예제에서는 하나의 명령 만 실행됩니다. 출력 창에서 확인할 수 있습니다.

행동을 재현하기 위해이 코드를 어기는 방법을 알아 냈습니다. 두 개의 i : EventTrigger 태그에서 동일한 SoruceName을 사용하여 단일 눈금에 바인딩합니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 그것은 당신이 정말로 내 문제를 도와주고 싶어 보인다 :) 그게 거의 내 코드의 excat 재생산. SourceName이 같지 않습니다. 하나는 lstProducts이고 다른 하나는 dgProducts입니다. 추가 할 때 중단 점을 설정할 때 제거를 클릭해도 추가됩니다. 그 반대도 마찬가지입니다. 하지만 두 개의 Breakpoints를 설정하면 하나만 입력됩니다. 매우 이상합니다. –

+0

내 코드를 실행하고 어떤 일이 발생하는지 확인하십시오. 어쩌면 차이점을 보게 될 것입니다. 그렇지 않으면 환경에 대해 설명하는대로 작동합니다. 이것은 우리가 mvvmlight의 다른 dll을 가지고 있음을 의미합니다. 오늘이 프로젝트를 다운로드했음을 주목하십시오 (4.0.23.1). – Rafal