2013-06-19 3 views
0

wpf 및 MVVM에서 아직 조금 익숙합니다. 그 패턴을 깨지 않고 솔루션을 코딩하려고합니다. 나는 두 개 (세 개 있지만이 질문의 범위는 두 개 뿐이다) DataGrid s이다. 하나의 행을 두 번 클릭하고 그 데이터를 두 번째 DataGrid에로드하고 싶습니다 (이상적으로는 데이터를로드하는 두 번째 스레드를 위로 돌릴 것입니다). 지금까지 행을 두 번 클릭하면 팝업 창이 열립니다. 이벤트의 코드를 xaml의 코드 뒤에 던졌습니다. 내게 그것은 매우 창문처럼 보인다. 어쩐지 또는 다른 내가 그 패턴을 큰 거래를 깨고 같은 느낌.행을 두 번 클릭하면 두 번째 DataGrid 채우기 WPF

<DataGrid ItemsSource="{Binding PopulationCollection}" Name="popDataGrid" 
      AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected" 
      CanUserAddRows="False" Margin="296,120,0,587" HorizontalAlignment="Left" Width="503" Grid.Column="1" 
      MouseDoubleClick="DataGrid_MouseDoubleClick"> 
</DataGrid> 

나는 MainWindowViewModel에 가야이 코드를 생각하고 여기 뒤에 코드에서 이벤트에 대한 코드 및

private void DataGrid_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) { 
    if (popDataGrid.SelectedItem == null) { 
     return; 
    } 
    var selectedPopulation = popDataGrid.SelectedItem as PopulationModel; 
    MessageBox.Show(string.Format("The Population you double clicked on has this ID - {0}, Name - {1}, and Description {2}", selectedPopulation.populationID, selectedPopulation.PopName, selectedPopulation.description)); 
} 

는 XAML에서 그리드의 정의입니다.

public ICommand DoubleClickPopRow { get { return new DelegateCommand(OnDoubleClickPopRow); }} 

와 같은 이벤트 핸들러를 : 그래서 나는 명령을 만들려고 시도하고는 DelegateCommand(OnDoubleClickPopRow)을 반환 할 때

private void OnDoubleClickPopRow(object sender, MouseButtonEventArgs e) { 
} 

그러나 ICommand는 예외를 던지고있다.

글쎄, 인수의 수가 일치하지 않는다는 것을 분명히 알 수 있습니다. 나는 잘못된 것을하고 있음을 알고 있지만 그것이 무엇인지는 확실히 모른다. 나는 이것을 계속 연구 할 것이지만 너희들이 줄 수있는 도움은 크게 감사 할 것이다.

답변

1
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
<DataGrid ItemsSource="{Binding PopulationCollection}" Name="popDataGrid" 
AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected" 
CanUserAddRows="False" Margin="296,120,0,587" HorizontalAlignment="Left" Width="503" Grid.Column="1" SelectedItem="{Binding ItemInViewModel}"></DataGrid> 
<i:Interaction.Triggers> 
<i:EventTrigger EventName="MouseDoubleClick"> 
<i:InvokeCommandAction Command="{Binding Save_Bid}" /> 
</i:EventTrigger> 
</i:Interaction.Triggers> 

이 내용을 DataGrid에 추가하고 뷰 모델에 코드를 추가 할 수 있습니다. 이제 뷰 모델의 항목에 선택한 항목이 바인딩되었으므로 해당 항목을 사용하여 이벤트가 시작될 때 사용할 항목과 원하는 항목을 시작할 수있는시기를 알 수 있습니다. 이벤트가 해지 될 때

bool Can_Fire_Event() 
{ 
if(ItemInViewModel != null) 
{ return true; } else { return false; } 
} 
private RelayCommand _saveBid; 
public ICommand SaveBid 
{ 
get 
{ 
if (_saveBid == null) 
{ 
_saveBid = new RelayCommand(param => Save_Bid(), param => Can_Fire_Event()); 
} 
return _saveBid; 
} 
} 

public void Save_Bid() 
{ 
//Open your new Window here, using your "ItemInViewModel" because this event couldn't be fired from your datagrid unless the "ItemInViewModel" had a value assigned to it 

} 
+0

어디에서이 코드를 추가 할 수 있습니까? 내 DataGridTextColumns 행 이전에 추가하려고했습니다. 그 이름 공간은 어떻습니까? 나는 그것이 그것을 찾을 수 없다는 것을 말하는 예외를 받고있다? 다운로드해야하는 DLL이 있습니까? – SoftwareSavant

+0

나는 이것을 구현하는 방법에 대해 여전히 혼란 스럽다. 독서를 좀 제안 해 주시겠습니까? – SoftwareSavant

+1

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=75e13d71-7c53-4382-9592-6c07c6a00207&displaylang=en 무료 SDK 다운로드 –

관련 문제