2017-12-14 1 views
1

DataGridToggleButton이 포함 된 열을 만들려고합니다. 단추의 IsChecked 속성은 내 데이터 항목 (INotifyPropertyChanged 구현)에 IsSelected이라는 속성에 바인딩됩니다.WPF 바인딩 쿼리 - 데이터 대화 상자의 토글 버튼

버튼을 클릭 할 때 처음 시도가 IsSelected을 업데이트하지 못했습니다. 다른 곳에서 값을 올바르게 표시 했는데도 내 시도가 실패했습니다.

상대 사용하여 바인딩

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate DataType="{x:Type local:DataItem}"> 
      <ToggleButton IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

또는의 UpdateSourceTrigger 속성을 설정

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate DataType="{x:Type local:DataItem}"> 
      <ToggleButton IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Path=DataContext.IsSelected}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

내 질문은 바인딩 :

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate DataType="{x:Type local:DataItem}"> 
      <ToggleButton IsChecked="{Binding IsSelected}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

는 stackexchange 주변 검색, 나는 몇 가지 해결책을 발견 왜 직접 바인딩을 사용하려면 명시 적으로 0123을 설정해야합니까?, 상대적인 바인딩 방법은 그렇지 않지만?

답변

1

DataGrid은 내부 트랜잭션 동작이 BindingGroup으로 구현되어 있으며 일반적으로 편집이 커밋 될 때까지 소스를 업데이트하지 않기 때문입니다. 데이터 객체가 IEditableObject 인터페이스를 구현하는 경우 셀 값을 편집 할 때 해당 BeginEdit()EndEdit() 메서드가 호출됨을 알 수 있습니다.

이에 대한 자세한 내용은 MSDN 포럼에서 다음 스레드를 참조하십시오 : https://social.msdn.microsoft.com/Forums/vstudio/en-US/7f7196b8-b9dc-487d-93cd-e77f5b3d9906/confused-about-transactional-editing-edititemcanceledit?forum=wpf

+0

내가 직접 바인딩의 경우 제대로 작동하려면 UpdateSourceTrigger =하여 PropertyChanged을 필요로 완전히 이유를 이해합니다. 그러나 귀하의 대답은 내 질문의 요점을 설명하지 않습니다 - 왜 RelativeSource를 사용하는 바인딩은 동일한 바인딩 매개 변수가 지정 될 필요가 없습니다. – Peregrine

+0

두 번째 예제에서는 DataGridCell의 속성에 바인딩되지만 기본 데이터 객체의 속성에는 직접 바인딩하지 않습니다. – mm8