DataGridTemplateColumn双向绑定不起作用

Dav*_*ter 14 data-binding wpf datagrid datagridtemplatecolumn two-way-binding

我有一个数据网格,我已经绑定到SqlDataApter.如果我使用DataTextColumn为网格设置XAML,如下面的代码所示,它可以很好地工作

<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>
Run Code Online (Sandbox Code Playgroud)

我使用dataGrid1.ItemsSource = dTable.DefaultView将其绑定到代码中的数据表,并使用SqlDataAdapter更新方法dAdapter.Update(dTable)保存更改的按钮

问题是我想在记录为NoNumeric时禁用编辑IC_DEF_CHAR_TEXT字段,而在记录IsText时禁用IC_DEF_CHAR_TEXT.我尝试绑定到IsReadOnly属性但发现它不可绑定,因此我为这两个字段创建了模板,并将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>
Run Code Online (Sandbox Code Playgroud)

这与我想要的完全一样,必要时启用了文本框.但是,在更新期间,TextBox中所做的更改不再保存到数据库中.有人可以向我解释为什么数据库不再被更新?

小智 63

我有同样的问题,没有更新源:

<DataGridTemplateColumn Header="Obs" IsReadOnly="False">
  <DataGridTemplateColumn.CellTemplate>
     <DataTemplate>
         <TextBox Name="txtObs" Width="80"  Text="{Binding Path=ObsPedido, Mode=TwoWay}"/>
      </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)

对我来说,它只是添加 UpdateSourceTrigger=PropertyChanged

<TextBox Name="txtObs" Width="80"  Text="{Binding Path=ObsPedido, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
Run Code Online (Sandbox Code Playgroud)

  • 我有同样的问题,设置`UpdateSourceTrigger = PropertyChanged`解决了它.我想这应该标记为答案. (7认同)
  • `UpdateSourceTrigger=LostFocus` 也适用,以防您不想在每次按键时更新。 (3认同)