积极答复者
wpf datagrid 单元格内容改变完成后动作和选择框选择改变动作

问题
答案
-
单元格编辑完成你可以用 DataGrid.CellEditEnding 事件来处理。当然,我这里还是要给你推荐另外一种设计方式。
如果你的DataGrid是绑定到一个数据源,例如一个List<Item>上的,那么,你可以对Item Class 实现 IEditableObject 接口。这个接口提供了三个方法,BeginEdit, CancelEdit 和 EndEdit。 我们的DataGrid在绑定更新数据源中所指定的某个数据项时候,他也会同时通知调用这个接口的三个方法,比如,我们要Commit某个单元格数据到后面绑定的数据项,EndEdit方法就会被触发。比如我们要开始编辑某个单元格的时候,这个单元格所绑定的后面的那个Item的BeginEdit就会被触发。你可以考虑下你的设计,采纳这种模式来使得你的逻辑代码和UI层分离。
对于第二个问题,我想先声明,WPF中本身是没有一个直接呈现二维集合的控件的,不像WinForm的DataGridView 我们可以有Columns并且可以通过RowIndex ColumnIndex来直接访问某个单元格。WPF中只有一维的ItemsControl, DataGridye也只是通过两个ItemsControl的层次叠加构成的。所以WPF 中的DataGrid在运行时,她的可视树上并没有Column这个概念,而只有Row的概念,每个Row又是一个ItemsControl,而Cell则是Row的成员。
好了,回到问题,你要DataGridCheckBoxColumn选择改变的事件或者通知,你可以这么做:
<DataGridCheckBoxColumn Header="Check"> <DataGridCheckBoxColumn.ElementStyle> <Style TargetType="{x:Type CheckBox}"> <EventSetter Event="Checked" Handler="CheckBox_Checked"/> <EventSetter Event="Unchecked" Handler="CheckBox_Unchecked"/> </Style> </DataGridCheckBoxColumn.ElementStyle> </DataGridCheckBoxColumn>
C#:
private void CheckBox_Checked(object sender, RoutedEventArgs e) { Console.WriteLine("Checked"); // TO DO... } private void CheckBox_Unchecked(object sender, RoutedEventArgs e) { Console.WriteLine("Unchecked"); // TO DO... }
最后,看你几个帖子都是在问DataGrid使用的,所以推荐你一篇文章关于DataGrid的:http://www.codeproject.com/KB/WPF/WPFDataGridExamples.aspx
Sincerely,
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已标记为答案 金钱豹 2011年6月30日 14:35
全部回复
-
单元格编辑完成你可以用 DataGrid.CellEditEnding 事件来处理。当然,我这里还是要给你推荐另外一种设计方式。
如果你的DataGrid是绑定到一个数据源,例如一个List<Item>上的,那么,你可以对Item Class 实现 IEditableObject 接口。这个接口提供了三个方法,BeginEdit, CancelEdit 和 EndEdit。 我们的DataGrid在绑定更新数据源中所指定的某个数据项时候,他也会同时通知调用这个接口的三个方法,比如,我们要Commit某个单元格数据到后面绑定的数据项,EndEdit方法就会被触发。比如我们要开始编辑某个单元格的时候,这个单元格所绑定的后面的那个Item的BeginEdit就会被触发。你可以考虑下你的设计,采纳这种模式来使得你的逻辑代码和UI层分离。
对于第二个问题,我想先声明,WPF中本身是没有一个直接呈现二维集合的控件的,不像WinForm的DataGridView 我们可以有Columns并且可以通过RowIndex ColumnIndex来直接访问某个单元格。WPF中只有一维的ItemsControl, DataGridye也只是通过两个ItemsControl的层次叠加构成的。所以WPF 中的DataGrid在运行时,她的可视树上并没有Column这个概念,而只有Row的概念,每个Row又是一个ItemsControl,而Cell则是Row的成员。
好了,回到问题,你要DataGridCheckBoxColumn选择改变的事件或者通知,你可以这么做:
<DataGridCheckBoxColumn Header="Check"> <DataGridCheckBoxColumn.ElementStyle> <Style TargetType="{x:Type CheckBox}"> <EventSetter Event="Checked" Handler="CheckBox_Checked"/> <EventSetter Event="Unchecked" Handler="CheckBox_Unchecked"/> </Style> </DataGridCheckBoxColumn.ElementStyle> </DataGridCheckBoxColumn>
C#:
private void CheckBox_Checked(object sender, RoutedEventArgs e) { Console.WriteLine("Checked"); // TO DO... } private void CheckBox_Unchecked(object sender, RoutedEventArgs e) { Console.WriteLine("Unchecked"); // TO DO... }
最后,看你几个帖子都是在问DataGrid使用的,所以推荐你一篇文章关于DataGrid的:http://www.codeproject.com/KB/WPF/WPFDataGridExamples.aspx
Sincerely,
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已标记为答案 金钱豹 2011年6月30日 14:35
-
非常感谢,我用CellEditEnding 基本可以满足需要!
另外选择框如此<DataGridCheckBoxColumn Header="Check">
<DataGridCheckBoxColumn.ElementStyle>
<Style TargetType="{x:Type CheckBox}">
<EventSetter Event="Checked" Handler="CheckBox_Checked"/>
<EventSetter Event="Unchecked" Handler="CheckBox_Unchecked"/>
</Style>
</DataGridCheckBoxColumn.ElementStyle>
</DataGridCheckBoxColumn> 后,就视乎不能双向绑定? -
可以继续双向绑定的,你可以忽略 DataGridCheckBoxColumn 上的绑定,直接在CheckBox的Style里面设置个Setter去双向绑定到CheckBox.IsCheked属性。
别忘了,我们的Column还有个EditElementStyle,你也可以用同样的代码在这里。
Sincerely,
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.