2013-03-12 2 views
2

저는 솔루션을 온라인으로 검색 할 때 많은 모습을 드러내지 않고이 사용자 정의 동작을 데이터 격자로 가져 오는 방법을 알아 내려고 노력했습니다.DataGridRow를 선택한 경우 데이터에서 사용자 지정 작업을 수행하려면 어떻게해야합니까?

다음 데이터 그리드 (간결 제거 일부 XAML)을 감안할 때 :

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Width="auto"> 
      <DataGridTemplateColumn.HeaderTemplate> 
       <DataTemplate> 
        <CheckBox /> 
       </DataTemplate> 
      </DataGridTemplateColumn.HeaderTemplate> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <CheckBox IsChecked="{Binding Selected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

내가 확인란이 성공적으로 각 행의 데이터 바인딩 된 개체에 바인딩해야합니다. (참고 : DataGridCheckBoxColumn 대신 DataGridTemplateColumn을 사용하므로 두 번 클릭하여 값을 변경할 필요가 없습니다.)

달성하고자하는 것은 사용자가 행을 선택할 때 데이터 바인딩 된 객체의 선택 속성을 업데이트하거나 확인란을 선택하는 기능입니다. 효과적으로 전체 행을 클릭하면 체크 상자의 체크 된 속성을 설정합니다. 이상적으로, 가능하다면 코드 숨김없이 코드를 유지하고 싶습니다. 최대한 코드를 깨끗하게 유지하려고합니다.

가능하면 행을 클릭하면 선택한 속성이 전환되므로 다른 속성을 클릭하면 이전 속성이 선택되고 새 속성이 선택됩니다.

도움을 주시면 감사하겠습니다.

+0

현재 IsChecked가 Selected로 바인딩되어있어 바인딩 오류가 발생합니까?난 당신이 이런 식으로 할 수있을 것 같아요 (미안 IDE 근처에 테스트하지)하지만 당신은 어쩌면 RelativeSource 검색과 올바른 선택 속성에 바인딩되어 있는지 확인해야 할 수도 있습니다? – Dutts

+0

선택한 것은 datagridrow가 아닌 ​​datacontext 항목의 속성 (아마도 가장 좋은 이름이 아님)이므로 의도 한대로 잘 작동합니다. 나는'datagridrow'를 isselected에 추가로 바인딩하려하지만이 바인딩 예제를 찾지 못했습니다. –

+0

아아, DataGrid에서 SelectedItem을 대신 살펴야 할 수도 있습니다. – Dutts

답변

1

명확성을 위해. 나는 내가하고 싶은 또 다른 특징은 가능하면 행에 클릭이 재산을 선택되어 전환 것이 될 것이다

을 이해 그래서 다른 하나 클릭, 이전은뿐만 아니라 선택된 상태를 유지하는 경우 새 항목 당신이 다음 DataGridRow가 선택되어 뷰 모델이 선택된 상태로 유지 할 수있는 항목에 각각 항목의 체크 박스 Selected 속성을 원하는 방식으로

, 아닌 DataGridRow 자체? 그 맞습니까?

나의 제안은 DataGrid 사용 * WPF 동작 * 님의 동작 (This is a good introduction. 당신은 분명히 당신의 코드 숨김을 유지할 수 있습니다,하지만 당신이 원하는 것을 할 수 있도록하기 위해 XAML을 비틀 필요가 없습니다이 방법을 확장하는 것입니다.

이것은 기본적으로 행동의 개념입니다 : 구체적인보기와 결합되지 않지만 그럼에도 불구하고 복잡한 코드를 XAML이 아닌 '실제'코드로 작성할 수있는 테스트 가능한 코드 작성. 내 의견으로는 동작에 대한 일반적인 작업

동작은 다음과 같이 간단 할 수 있습니다.

특정 데이터 그리드의 동작을 부착
public class CustomSelectionBehavior : Behavior<DataGrid> 
{ 
    protected override void OnAttached() 
    { 
     // Set mode to single to be able to handle the cklicked item alone 
     AssociatedObject.SelectionMode = DataGridSelectionMode.Single; 
     AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged; 
    } 

    private void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs args) 
    { 
     // Get DataContext of selected row 
     var item = args.AddedItems.OfType<ItemViewModel>(); 

     // Toggle Selected property 
     item.Selected = !item.Selected; 
    } 
} 

는 XAML로 수행됩니다

<DataGrid ...> 
    <i:Interaction.Behaviors> 
     <b:CustomSelectionBehavior /> 
    </i:Interaction.Behaviors> 
    ... 
</DataGrid> 

당신은뿐만 아니라 Behavior<T>의 base class를 포함

System.Windows.Interactivity.dll 

을 참조 할 필요가있다.

+0

이것은 완벽하게 작동하며 원하는 동작을 얻으려면 약간의 조정이 필요하지만 멋지고 간단합니다. –

+0

좋은 행운을 빕니다! – Marc

관련 문제