11

Ich habe ein Datagrid, das ich an einen SqlDataApter gebunden habe. Wenn ich das XAML für das Gitter mit DataTextColumn eingerichtet wie in den Code unten veranschaulicht es perfektDataGridTemplateColumn Zwei-Wege-Bindung funktioniert nicht

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

arbeitet ich dies in Code in eine Datentabelle bin Bindung mit dataGrid1.ItemsSource = dTable.DefaultView und hat eine Schaltfläche, um die Änderungen mit der SqlDataAdapter Update-Methode spart dAdapter.Update (dTabelle)

das Problem ist, dass ich die Bearbeitung der IC_DEF_CHAR_TEXT Feld deaktiviert werden soll, wenn der Datensatz isNumeric und die IC_DEF_CHAR_TEXT, wenn der Datensatz ISTEXT. Ich habe versucht, an die IsReadOnly-Eigenschaft zu binden, habe aber festgestellt, dass sie nicht bindbar ist. Daher habe ich Vorlagen für die beiden Felder erstellt und die IsEnabled-Eigenschaft an die IsText- und IsNumeric-Felder gebunden.

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

Das funktionierte genau wie ich wollte, wurden die Textfelder bei Bedarf aktiviert. Die in den TextBoxen vorgenommenen Änderungen werden jedoch nicht mehr während der Aktualisierung in der Datenbank gespeichert. Kann mir jemand da draußen erklären, warum die Datenbank nicht mehr aktualisiert wird?

+0

Versuchen Sie, die 'CellTemplate' zu ​​ändern, um keine bidirektionale Bindung zu verwenden, da sie im Wesentlichen nur als Fenster fungieren soll. – Shoe

+0

Ich habe es ursprünglich so eingerichtet und das hat auch nicht funktioniert. Ich denke, dass der Weg zwei ist, aber ich bin mir nicht 100% sicher. –

+0

Was ich meine ist, dass 'TextBox' standardmäßig auf 'Two-Way' gesetzt wird, versuche es in' One-Way' auf 'CellTemplate' zu ​​ändern. Sie wollen nur 'Two-Way' auf' CellEditingTemplate' – Shoe

Antwort

50

hatte ich das gleiche Problem, nicht die Quelle der Aktualisierung:

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

Für mich ist es nur UpdateSourceTrigger=PropertyChanged

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

Ich hatte das gleiche Problem und die Einstellung der 'UpdateSourceTrigger = PropertyChanged' löste es. Ich denke, das sollte als Antwort markiert werden. –

+0

Das gleiche Problem, das hat es gelöst. Fühlt sich an wie ein Käfer. –

+0

Das löste mein Problem auch. Dies ist ein Fehler mit nur DataGrid, denke ich. Die 2-Wege-Bindung funktioniert wie erwartet mit normalen Feldern außerhalb von DataGrid. – AnjumSKhan

0

Zugabe habe ich das gleiche Problem und die Lösung von @jrivam geschrieben hatte nicht tat Hilfe. Damit meine Bindung korrekt funktioniert, musste ich CellEditingTemplate ändern, um den OneWayToSource Binding Mode zu verwenden.

<DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Path=IC_DEF_CHAR_TEXT, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
Verwandte Themen