高级大宅男 发表于 2016-4-28 15:43:35

假如我在前台C1Datagrid中写了一个模板列,列里放有一个控件,如何在后台取到该控件

<c1:DataGridTemplateColumn Name="col1" Header="col1" Width="75">
    <c1:DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
            <CheckBox x:Name="chk1"></CheckBox>
      </DataTemplate>
    </c1:DataGridTemplateColumn.CellTemplate>
</c1:DataGridTemplateColumn>

如何在后台通过代码,直接取到chk1?


Alice 发表于 2016-4-28 17:00:36

在WPF平台下从DataTemplate下获取控件,需要从逻辑树上获取。
可以使用WPF平台的VisualTreeHelper方法去获取逻辑树的元素(写代码通过控件的名称在逻辑树上查找),详细的使用方法可以参考微软的msdn。

如果是进入编辑状态,可以拿到EditElment,获取到这个控件。
void grid_BeganEdit(object sender, DataGridBeganEditEventArgs e)
      {
            var ch= e.EditingElement as CheckBox;
            if (ch!= null)
            {      }
      }

高级大宅男 发表于 2016-4-28 18:06:42

Alice 发表于 2016-4-28 17:00
在WPF平台下从DataTemplate下获取控件,需要从逻辑树上获取。
可以使用WPF平台的VisualTreeHelper方法去获 ...

并不好取得 C1DataGrid的Column并没有GetCellContent方法,只有GetCellEditingContent方法,然而我并没有设置CellEditingTemplate(我想让他可以直接操作,而不用点一下进入编辑模式)

Alice 发表于 2016-4-29 09:20:20

高级大宅男 发表于 2016-4-28 18:06
并不好取得 C1DataGrid的Column并没有GetCellContent方法,只有GetCellEditingContent方法,然而我并没有 ...

在WPF下可以通过名字在VirtualTree上获取。
从VirtualTree上通过名字获取控件的方法参考:

public static T FindVisualChildByName<T>(Visual parent, string name) where T : Visual
         {
             if (parent != null)
             {
               for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
               {
                     var child = VisualTreeHelper.GetChild(parent, i) as Visual;
                     string controlName = child.GetValue(Control.NameProperty) as string;
                     if (controlName == name)
                     {
                         return child as T;
                     }
                     else
                     {
                         T result = FindVisualChildByName<T>(child, name);
                         if (result != null)
                           return result;
                     }
               }
             }
             return null;
         }

页: [1]
查看完整版本: 假如我在前台C1Datagrid中写了一个模板列,列里放有一个控件,如何在后台取到该控件