如何从DataTemplate中检索元素并绑定到它?

时间:2011-04-15 15:14:58

标签: c# wpf xaml binding datatemplate

我试图在代码中处理我的DataTemplate中的元素。我在代码中创建了一系列DataGridTemplateColumns,然后我将其分配给网格。 我希望能够从xaml中检索DataTemplate,找到我的元素并绑定到该特定元素。

以下是我想要实现的简短示例代码:

<DataTemplate x:Key="dataTemplate">
    <Grid TextBlock.Foreground="LightGreen" Background="Yellow">
        <TextBlock x:Name="txt" />
    </Grid>
</DataTemplate>
DataGridTemplateColumn col = new DataGridTemplateColumn();
col.Header = "Last Name";
Binding b = new Binding("LastName");
DataTemplate dtemplate = (DataTemplate)FindResource("dataTemplate");
TextBlock textBlock = dtemplate.FindName("txt", this);
textBlock.SetBinding(TextBlock.TextProperty, b);
col.CellTemplate = dtemplate;

grid.Columns.Add(col);

或许可以进一步解释: 我正在尝试动态创建一组DataGridTemplateColumns并将其应用于Datagrid。由于我不知道要绑定的属性,直到源被呈现给我,我无法创建嵌套在其自身内的DataTemplate已经内置此绑定。喜欢:

<TextBlock Text={Binding=LastName} ... >

所以我被迫在运行时创建一组DataGridTemplateColumn,在我的资源中查找DataTemplate,然后尝试将该列绑定到我的数据源上的属性(如LastName)。

2 个答案:

答案 0 :(得分:0)

我会通过CellStyle来解决这个问题:

<DataGrid.Resources>
    <Style x:Key="CellStyle" TargetType="{x:Type DataGridCell}">
        <Setter Property="TextBlock.Foreground" Value="LawnGreen"/>
        <Setter Property="Background" Value="Yellow"/>
    </Style>
</DataGrid.Resources>
DataGridTextColumn col = new DataGridTextColumn();
col.Binding = new Binding("Name");
col.CellStyle = dataGrid.Resources["CellStyle"] as Style;
dataGrid.Columns.Add(col);

还有一些方法可以通过DataTemplates执行此操作,但在这种情况下似乎没有必要(除非您的问题更复杂)。

答案 1 :(得分:0)

我对问题的解决方法是这样的:

 GridView viewLayout = new GridView();

        for (int i = 0; i < Apprefs.tables[0].Headers.Count(); i++)
        {
            GridViewColumn gvc = new GridViewColumn();
            string colName = Apprefs.tables[0].Headers[i];
            gvc.Header = colName;
            gvc.Width = 80;
            gvc.CellTemplate = SetTemplete(i); ;
            viewLayout.Columns.Add(gvc);
       }

        listview1.View = viewLayout;

        //set binding
        listview1.ItemsSource = Apprefs.tables[0].Rows;

然后:

    /// <summary>
    /// Create DataTemplate
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    private DataTemplate SetTemplete(int i)
    {
        DataTemplate template = new DataTemplate();

        //set stack panel 
        FrameworkElementFactory sp = new FrameworkElementFactory(typeof(StackPanel));
        sp.Name = "spBind";
        sp.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);

        //set textblock
        FrameworkElementFactory tb = new FrameworkElementFactory(typeof(TextBlock));
        sp.Name = "tbBind";
        Binding b = new Binding();
        string ito = "[" + i.ToString() + "]";  // bind by index
        b.Path = new PropertyPath(ito);
        tb.SetBinding(TextBlock.TextProperty, b);
        sp.AppendChild(tb);

        //set the visual tree of the data template 
        template.VisualTree = sp;

        return template;
    }