11

Tôi đã có một DataGrid tôi đã ràng buộc với một SqlDataApter. Nếu tôi đặt lên XAML cho lưới điện sử dụng DataTextColumn như minh họa trong đoạn code dưới đây nó hoạt động hoàn hảoDataGridTemplateColumn Hai cách ràng buộc không hoạt động

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

Tôi ràng buộc này để một DataTable trong mã sử dụng dataGrid1.ItemsSource = dTable.DefaultView và có một nút để lưu thay đổi bằng cách sử dụng phương thức cập nhật SqlDataAdapter dAdapter.Update (dTable)

Vấn đề là tôi muốn vô hiệu hóa chỉnh sửa trường IC_DEF_CHAR_TEXT khi bản ghi làNumeric và IC_DEF_CHAR_TEXT khi bản ghi IsText. Tôi đã cố gắng ràng buộc với các tài sản IsReadOnly nhưng thấy rằng nó không phải là bindable, vì vậy tôi tạo ra các mẫu cho hai lĩnh vực và ràng buộc các tài sản IsEnabled để IsText và IsNumeric lĩnh vực.

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

này làm việc giống hệt như tôi muốn, textbox đã được kích hoạt khi cần thiết. Tuy nhiên những thay đổi được thực hiện trong các TextBox không còn được lưu vào cơ sở dữ liệu trong khi cập nhật. Ai đó có thể giải thích cho tôi tại sao cơ sở dữ liệu không còn được cập nhật?

+0

Hãy thử thay đổi 'CellTemplate' để không sử dụng liên kết hai chiều vì nó chủ yếu chỉ được coi là cửa sổ. – Shoe

+0

Tôi ban đầu thiết lập nó theo cách đó và điều đó đã không hoạt động. Tôi nghĩ rằng hai cách là mặc định nhưng tôi không chắc chắn 100% về điều đó. –

+0

Ý của tôi là 'TextBox' sẽ mặc định là' Two-Way', hãy thử đổi nó thành 'One-Way' trên' CellTemplate'. Bạn chỉ muốn 'Hai chiều' trên' CellEditingTemplate' – Shoe

Trả lời

50

tôi đã cùng một vấn đề, không cập nhật các nguồn:

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

Đối với tôi nó chỉ làm việc thêm UpdateSourceTrigger=PropertyChanged

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

Tôi đã có cùng một vấn đề và thiết lập 'UpdateSourceTrigger = PropertyChanged' giải quyết nó. Tôi đoán điều này nên được đánh dấu là câu trả lời. –

+0

Cùng một vấn đề, điều này giải quyết nó. Cảm thấy như một con bọ. –

+0

Điều này đã giải quyết được vấn đề của tôi. Đây là một lỗi chỉ với DataGrid, tôi nghĩ vậy. Liên kết 2 chiều hoạt động như mong đợi với các trường thông thường bên ngoài DataGrid. – AnjumSKhan

0

tôi đã cùng một vấn đề và giải pháp đăng bởi @jrivam không Cứu giúp. Đối với tôi để có được ràng buộc của tôi để làm việc một cách chính xác, tôi đã phải thay đổi CellEditingTemplate để sử dụng chế độ ràng buộc OneWayToSource.

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