11

私はSqlDataApterにバインドしたデータグリッドを持っています。私はDataTextColumnを使用してグリッドのXAMLを設定した場合、それは完全にDataGridTemplateColumn双方向バインディングが機能しない

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="27,42,0,0" Name="dataGrid1" VerticalAlignment="Top" AreRowDetailsFrozen="True"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding KEY}" Visibility="Hidden" IsReadOnly="True"></DataGridTextColumn> 
      <DataGridTextColumn Binding="{Binding CHARACTERISTIC_CODE}" Header="Unit" IsReadOnly="True" /> 
      <DataGridTextColumn Binding="{Binding UNIT_CHAR}" Header="Unit" IsReadOnly="True" /> 
      <DataGridTextColumn Binding="{Binding IC_DEF_CHAR_NUMERIC}" Header="Number" IsReadOnly="False"/> 
      <DataGridTextColumn Binding="{Binding IC_DEF_CHAR_TEXT}" Header="Text" IsReadOnly="False" /> 
      <DataGridTextColumn Binding="{Binding IsNumeric}" Header="Status" IsReadOnly="True" /> 
      <DataGridTextColumn Binding="{Binding IsText}" Header="Status" IsReadOnly="True" /> 
     </DataGrid.Columns> 

私が使用してコード内でデータテーブルにこれを結合してい dataGrid1.ItemsSource = dTable.DefaultView 作品の下のコードに示すように、そして、私はIC_DEF_CHAR_TEXTフィールドを編集無効にすることSqlDataAdapterオブジェクトの更新方法 dAdapter.Update(dTable)

問題があるを使用して変更を保存ボタンを持っている場合、レコードISNUMERICとIC_DEF_CHAR_TEXT時に記録ISTEXT。私はIsReadOnlyプロパティにバインドしようとしましたが、バインド可能でないことがわかりましたので、2つのフィールドのテンプレートを作成し、IsEnabledプロパティをIsTextおよびIsNumericフィールドにバインドしました。私は必要なときにテキストボックスが有効になった、望んでいたよう

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="27,42,0,0" Name="dataGrid1" VerticalAlignment="Top" AreRowDetailsFrozen="True"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding KEY}" Visibility="Hidden" IsReadOnly="True"></DataGridTextColumn> 
      <DataGridTextColumn Binding="{Binding CHARACTERISTIC_CODE}" Header="Unit" IsReadOnly="True" /> 
      <DataGridTextColumn Binding="{Binding UNIT_CHAR}" Header="Unit" IsReadOnly="True" /> 
      <DataGridTemplateColumn Header="Numeric" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding Path=IC_DEF_CHAR_NUMERIC, Mode=TwoWay}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
       <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
         <TextBox IsReadOnly="False" Text="{Binding Path=IC_DEF_CHAR_NUMERIC, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
       </DataTemplate> 
       </DataGridTemplateColumn.CellEditingTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTemplateColumn Header="Text" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding Path=IC_DEF_CHAR_TEXT, Mode=TwoWay}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
       <DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding Path=IC_DEF_CHAR_TEXT, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellEditingTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 

これは正確に働きました。ただし、TextBoxの変更は更新中にデータベースに保存されなくなりました。そこにいる誰かが、なぜデータベースがもはや更新されていない理由を私に説明することはできますか?

+0

「CellTemplate」を変更すると、双方向バインディングが使用されないようになりました。本質的には、ウィンドウとして機能するようになっているからです。 – Shoe

+0

私はもともとそれをそのように設定していて、それもうまくいきませんでした。私は2つの方法がデフォルトだと思うが、私はそれを100%確信しているわけではない。 –

+0

私は、 'TextBox'はデフォルトで' Two-Way'になり、 'CellTemplate'に対して' One-Way'に変更しようとしています。あなたは 'CellEditingTemplate'の' Two-Way'だけを望んでいます – Shoe

答えて

50

私はソースを更新していない、同じ問題を抱えていた:私にとって

<DataGridTemplateColumn Header="Obs" IsReadOnly="False"> 
    <DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <TextBox Name="txtObs" Width="80" Text="{Binding Path=ObsPedido, Mode=TwoWay}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

を、それは私が同じ問題を抱えていたと@jrivamによって投稿解決はしませんでしUpdateSourceTrigger=PropertyChanged

<TextBox Name="txtObs" Width="80" Text="{Binding Path=ObsPedido, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
+5

私は同じ問題があり、それを解決する 'UpdateSourceTrigger = PropertyChanged'を設定しました。私はこれが答えとしてマークされるべきだと思います。 –

+0

同じ問題ですが、これで解決しました。バグのように感じる。 –

+0

これも私の問題を解決しました。これはDataGridだけのバグだと思います。 2ウェイバインドは、DataGrid外の通常のフィールドで期待通りに機能します。 – AnjumSKhan

0

を追加するだけで働いていました助けて。私のバインディングを正しく動作させるために、OneWayToSourceバインディングモードを使用するようにCellEditingTemplateを変更する必要がありました。

<DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Path=IC_DEF_CHAR_TEXT, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
関連する問題