none
wpf datagrid 单元格内容改变完成后动作和选择框选择改变动作 RRS feed

  • 问题

  • 如题,单元格内容完成后想执行一个动作,暂时用的LostKeyboardFocus。
    另外DataGridCheckBoxColumn不知道选择改变的事件是什么?
    非常感谢!
    2011年6月29日 2:08

答案

  • 单元格编辑完成你可以用 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
    2011年6月29日 7:39
    版主

全部回复

  • 单元格编辑完成你可以用 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
    2011年6月29日 7:39
    版主
  • 非常感谢,我用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> 后,就视乎不能双向绑定?

    2011年6月30日 2:21
  • 可以继续双向绑定的,你可以忽略 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.

    2011年6月30日 3:39
    版主
  • 哦,好的,非常感谢啊!
    2011年6月30日 14:35