2013-12-23 5 views
0

사용자가 여러 옵션 중에서 사전을 선택할 때 WPG DataGrid가 있고 DG의 ItemsSource이 설정됩니다.WPF DataGrid.SelectedItem 할당이 작동하지 않음

DG에 CheckBox 열을 추가하고 한 번에 한 행만 IsChecked = true 개가 될 수 있도록 설정했습니다. 사용자가 상자 중 하나를 "확인할"때 Checked 이벤트 핸들러는 모든 행을 순환하며 으로 선택한 행만 남겨둔 채로 을 SelectedItem을 제외한 각 행의 CheckBox에 설정합니다. 체크 박스가 사용자에 의해 Checked 일 때이 작동합니다.

그러나이 CheckBox 열은 사전의 데이터에 "바인딩"되어 있지 않습니다. 따라서 사용자가 DG를 바인딩 할 사전을 "선택할"때 해당 사전의 "기본"개체는 "기본값"으로 표시되지 않습니다. 그래서 .IsChecked = trueItemsSource이 설정된 직후 올바른 행을 시도합니다.

하지만 내 Checked 이벤트 처리기 IsChecked = falseSelectedItem을 제외한 모든 항목에 문제가 있음을 확인한 다음 SelectedItem을 확인합니다.

사용자가 처음에 DG에 바인딩 할 사전을 선택하면 프로그래밍 방식으로 DG가 채워집니다 (확인 됨). 따라서 SelectedItem은 항상 첫 번째 행입니다. 따라서 ACTUAL 기본 개체 인 IsChecked = true 대신 DG IsChecked = true이 첫 번째 행입니다.

내가 솔루션에 도착 가장 가까운 : 는 그 대신 SelectedItem을 얻는, 그것을 파악하도록 Checked 이벤트 핸들러를 수정하려고하는 행되는 "기본"행, "선택 취소"다른 모든 행 및 만 이 행을 "선택"합니다. 그러나 어떤 이유로이 호출이 작동하지 않습니다.

dataGridSymbols.UnselectAll() 
    dataGridSymbols.SelectedItem = row 

아무도이 통화에 문제가 있다는 것을 알고 있습니까? 나는 내가 행을 올바르게 설정했다는 것을 안다. 어쩌면 SelectedItem을 객체에 설정해야하지만 행에서 객체에 어떻게 접근해야 할까?

+1

코드를 설명하는 대신 코드를 추가로 표시해야합니다. –

+0

감사합니다. @DarylBehrens - 코드 자체가 도움이 될 것이라고 생각하지 않았습니다. 내 문제가 구문이나 다른 것이 아니기 때문에 일반적인 개념이었습니다. 다시 생각해 보면, 여기에있는 대부분의 사람들이 어쨌든 단어 대신 코드를 통해 개념을 이해하는 것을 선호하기 때문에 코드를 게시하면 더 많은 도움이 될 것입니다. 그래서 내가 답을 올렸을 때 코드에 게시했습니다. 팁 고마워. –

+0

문제 없음. MVVM 패턴을 조사해 보는 것이 좋습니다. WPF에서와 같이 작업하는 것이 좋습니다. 여기에있는 코드는 코드에 있기 때문에 테스트하기가 매우 어려울 것입니다. –

답변

0

나는 이것을 알아 냈다. SelectedItem (단지 강조 표시된 부분을 반환하는) 대신에 Checked 이벤트 처리기가 호출 된 행을 사용하는 방법을 찾았습니다. 아무도보고 싶지 않을 때 그것을 해결 한 코드가 있습니다.

var cell = sender as DataGridCell; 
    if (cell == null) 
     return; 

    // Keep getting parents until you get to the sender's row... 
    var parent = VisualTreeHelper.GetParent(cell); 
    while (parent != null && parent.GetType() != typeof(DataGridRow)) 
    { 
     parent = VisualTreeHelper.GetParent(parent); 
    } 
    var row = parent as DataGridRow; 
    if (row == null) 
     return; 

    var rowIndex = row.GetIndex(); 
관련 문제