DataGridTemplateColumn双向绑定不起作用

时间:2013-08-13 18:42:58

标签: wpf data-binding 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>

我正在使用代码将其绑定到代码中的数据表    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>

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

2 个答案:

答案 0 :(得分:60)

我遇到了同样的问题,没有更新来源:

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

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

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

答案 1 :(得分:0)

我遇到了同样的问题,@ jrivam发布的解决方案没有帮助。为了让我的绑定正常工作,我不得不改变CellEditingTemplate以使用OneWayToSource绑定模式。

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