WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter

一、如何从 Datagrid 中获得单元格的内容

   DataGrid 属于一种 ItemsControl, 因此,它有 Items 属性并且用ItemContainer 封装它的 items. 

但是,WPF中的DataGrid 不同于Windows Forms中的 DataGridView。 在DataGrid的Items集合中,DataGridRow

是一个Item,但是,它里面的单元格却是被封装在 DataGridCellsPresenter 的容器中;因此,我们不能使用

DataGridView.Rows.Cells 这样的语句去获得单元格的内容。但是,在WPF中我们可以通过可视树(VisualTree)

去进入到控件“内部“, 那么,我们当然可以通过VisualTree进入DataGrid中的DataGridRow 和 DataGridCellsPresenter

并且得到在DataGridCellsPresenter中的实例, 大家可以通过以下的代码遍历VisualTree

DataGridRow rowContainer = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(rowIndex);
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);

// ...

public static T GetVisualChild<T>(Visual parent) where T : Visual
{
  T child = default(T);
  int numVisuals = VisualTreeHelper.GetChildrenCount(parent);

  for (int i = 0; i < numVisuals; i++)
  {
    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
    child = v as T;

    if (child == null)
      child = GetVisualChild<T>(v);
    else
      break;
  }

  return child;
}

 二、WPF 使用值转换器进行绑定数据的转换IValueConverter

    有的时候,我们想让绑定的数据以其他的格式显示出来,或者转换成其他的类型,我们可以

使用值转换器来实现.比如我数据中保存了一个文件的路径”c:\abc\abc.exe”,但是我想让他在前台

列表中显示为”abc.exe”.首先我们先建一个IvalueConverter接口的类.

  

class GetFileName : IValueConverter
{
    //Convert方法用来将数据转换成我们想要的显示的格式
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        FileInfo fi = new FileInfo((string)value);
        return fi.Name;
    }
    //ConvertBack方法将显示值转换成原来的格式,因为我不需要反向转换,所以直接抛出个异常
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}  

 

为了使用这个转换器,我们要将项目的名称空间映射到xaml中,比如我项目名字为自动更新,用local作为空间名称前缀

xmlns:local="clr-namespace:命名空间"  

为了使用的更方便,我们在Resources集合中创建一个转换器对象

<Window.Resources>
    <local:GetFileName x:Key="GetFileName"></local:GetFileName>
</Window.Resources>

现在我们去绑定数据的地方使用StaticResource来指向转换器

<TextBlock>
    <TextBlock.Text>
        <Binding Path="FileName">
            <Binding.Converter>
                <local:GetFileName></local:GetFileName>
            </Binding.Converter>
        </Binding>
    </TextBlock.Text>
</TextBlock>  

或者这样使用:

<TextBlock Text="{Binding Path=FileName,Converter={StaticResource GetFileName}}"  />

 

 

时间: 2024-09-09 04:18:41

WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter的相关文章

在 datagrid 中 当单元格的数据更改时,改变同行的一个单元格的内容

问题描述 当"名称"里的内容被修改时,要异步修改"编码"里的内容. 解决方案 解决方案二:是用的Easyui里面的gridview吗?解决方案三:单元格值更改事件写就行了,判断下列的值解决方案四:是datagrid数据表格解决方案五:vargcs=function(){$('#DMMC').change(function(){varobj=newObject();$.post(bootPATH+"Data_Dictionary/GetChineseSpel

在Excel工作表中选择单元格及其内容

在工作表 (工作表:在 Excel 中用于存储和处理数据的主要文档.也称为电子表格.工作表由排列成行或列的单元格组成.工作表总是存储在工作簿中.)中,您可以选择单元格.区域 (区域:工作表上的两个或多个单元格.区域中的单元格可以相邻或不相邻.).行或列.还可以使单元格处于编辑模式并选择该单元格的所有或部分内容. 您可以在 Microsoft Office Excel 表格中选择单元格和区域,就像在工作表中选择它们一样,但是选择表格的行和列不同于选择工作表的行和列. 注释 如果工作表处于受保护状态

改变datagrid里某个单元格的内容,可以引发事件吗?(winform,vs.NET2003)

问题描述 RT 解决方案 解决方案二:可以的,引发CurrentCellChanged事件解决方案三:CurrentCellChanged事件可以去到上一个cell的内容吗?我要实现的功能是:把一行当中第0列的值给改变了,这行相应的信息都给现实出来.(第0列是个key值)貌似用CurrentCellChanged无法实现...主要是取不到上一个cell的内容.哪位大虾还有什么办法吗??

Excel2013中合并单元格有什么技巧?

  在使用Excel2013的过程中,我们常常会遇到需要合并单元格的情况,不论你是合并同行单元格中的内容,还是合并同列单元格中的内容,抑或是要合并某几个不同行列的单元格内容,在这里,我们都能找到最适合的方法,一起来瞧瞧吧. 合并同一行中连续单元格 用Excel2013打开需要合并同行单元格的工作表,例如,我们现在来合并A1至D1单元格中的内容,选中E1单元格,输入函数"=PHONETIC(A1:D1)",然后按下回车键,就能看到A1至D1四个单元格中的内容已经合并到E1单元格中了,效果

vb6 0-【vb+sql】选中datagrid的某一行,使其第一个单元格的内容显示在text文本框中?

问题描述 [vb+sql]选中datagrid的某一行,使其第一个单元格的内容显示在text文本框中? 比如这个情况,我就需要选中第一行的时候,text1.text=1001 我已经编写的代码: Option Explicit Private Sub Command1_Click() Dim cn As New ADODB.Connection Dim rs_findsp As New ADODB.Recordset cn.CursorLocation = adUseClient cn.Conn

获取wpf datagrid当前被编辑单元格的内容

原文 获取wpf datagrid当前被编辑单元格的内容 确认修改单元个的值, 使用到datagrid的两个事件 开始编辑事件 BeginningEdit="dataGrid_BeginningEdit" 编辑结束事件 CellEditEnding="dataGrid_CellEditEnding" 代码片段如下 //开始修改时单元格内的值string preValue = "";private void dataGrid_BeginningEd

Excel中合并单元格中快速添加序号的方法

  Excel中合并单元格中快速添加序号的方法          如下图所示,需要在数据的A列加入序号: 如果我们利用传统的拖动填充方式添加序号,系统会弹出这样的提示:"此操作要求合并单元格都具有相同大小" 即不能对数据源格式进行修改,又不能用常规方法添加序号,怎么办呢? 要手工逐个的填写吗? 答案是否定的,如果数据量太大的话,我们不可能一个一个去手工添加吧. 这里给大家介绍一个简单的方法. 首先,选中要添加序号的单元格: 编辑栏输入公式: =MAX($A$1:A1)+1 注意关键的一

Excel中的单元格引用

Excel中的工作表(Worksheet)是由一系列行和列组成的二维表,当我们在使用Excel创建应用程序(例如编写VBA代码),或者创建一个复杂的Excel应用(例如公式.数据透视表.统计图表等)时,需要引用独立的Excel单元格(称之为Cell)或单元格区域(称之为Range),详细了解各种不同单元格或单元格区域的引用和设置方式是非常重要的,这将有助于改善我们的操作习惯或编程方式,从而提高工作效率. 两种单元格引用方式 可能有许多用户并不是特别清楚,在Excel中,有两种单元格引用方式:A1

在Word 2007表格中选中单元格

选中特定单元格是Word2007表格的基本操作,在设置单元格格式等操作时首 先需要选中单元格.在Word2007中选中单元格的方法如下所述: 打开Word2007文档窗口,将鼠标指针移动到准备选中的单元格内部左侧位置 .当鼠标指针呈黑色箭头形状时,单击鼠标左键即可选中当前单元格.如果在鼠 标指针呈黑色箭头形状时拖动鼠标,则可以选中连续多个单元格,如图 2009010808所示. 图2009010808 选中单元格 用户还可以在单击准备选中的单元格后,在"表格工具"功能区 的"