2017-12-14 14 views
1

DataGridToggleButtonを含む列を作成しようとしています。ボタンのIsCheckedプロパティは、データ項目(INotifyPropertyChangedを実装)のIsSelectedというプロパティにバインドされています。WPFバインディングクエリ - データグリッドのトグルボタン

ボタンをクリックしたときに初めてIsSelectedを更新できませんでしたが、別の場所に設定しても値が正しく表示されました。

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

はstackexchange周りを検索、私はソリューションのカップルが見つかりました:

は結合

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

か私の質問があり、相対結合

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

を使用してのUpdateSourceTriggerプロパティを設定しますなぜ直接バインディングを使用するには明示的に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

2番目の例では、DataGridCellのプロパティにバインドしており、基になるデータオブジェクトのプロパティには直接バインドしません。 – mm8

関連する問題