DataGridTemplateColumn 两种方式绑定不起作用

Posted

技术标签:

【中文标题】DataGridTemplateColumn 两种方式绑定不起作用【英文标题】:DataGridTemplateColumn Two way binding is not working 【发布时间】:2013-08-15 12:30:07 【问题描述】:

我有一个DataGrid 我已经绑定到一个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 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>
</DataGrid>

我将其绑定到代码中的DataTable,使用:

dataGrid1.ItemsSource = dTable.DefaultView

我有一个使用 ذSqlDataAdapterذ 更新方法保存更改的按钮:

dAdapter.Update(dTable)

问题是我想在记录isNumeric 和IC_DEF_CHAR_TEXT 记录IsText 时禁用编辑IC_DEF_CHAR_TEXT 字段。我尝试绑定到IsReadOnly 属性,但发现它不可绑定,因此我为这两个字段创建了模板并将IsEnabled 属性绑定到IsTextIsNumeric 字段。

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

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

【问题讨论】:

尝试将CellTemplate 更改为不使用双向绑定,因为它本质上只应该充当窗口。 我最初是这样设置的,但也没有用。我认为两种方式是默认的,但我不是 100% 确定这一点。 我的意思是TextBox 将默认为Two-Way,尝试在CellTemplate 上将其更改为One-Way。你只想要Two-Way on CellEditingTemplate 我刚刚尝试过,但也没有用。感谢您的尝试 你说的我尝试绑定到 IsReadOnly 属性但发现它不可绑定是什么意思?你应该能够绑定到这个。当你这样做时发生了什么? 【参考方案1】:

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

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

【讨论】:

我遇到了同样的问题,设置UpdateSourceTrigger=PropertyChanged 解决了它。我想这应该被标记为答案。 这也解决了我的问题。我认为这是一个只有 DataGrid 的错误。 2 路绑定与 DataGrid 外部的普通字段按预期工作。 有同样的问题,这也为我解决了! :-) 谢谢。 天哪!我正在寻找这个解决方案大约 2 小时!我什至开始考虑实现“TrueObservableCollection”,但我终于找到了这个!谢谢! UpdateSourceTrigger=LostFocus 也可以使用,以防您不想在每次按键时都更新。【参考方案2】:

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

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

【讨论】:

以上是关于DataGridTemplateColumn 两种方式绑定不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在代码中从 WPF 数据网格列标题 (DataGridTemplateColumn) 获取工具提示?

DataGrid DataGridTemplateColumn

DataGridTemplateColumn :在使用 ItemsSource 之前,Items 集合必须为空。

DataGridTemplateColumn :在使用 ItemsSource 之前,Items 集合必须为空。

WPF 动态列(DataGridTemplateColumn) 绑定数据 (自定义控件)

如何将 DataGridTemplateColumn.Visibility 绑定到 DataGrid.ItemsSource 之外的属性?