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)
问题是我想在记录isNumeri
c 和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 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 之外的属性?