tags:

views:

128

answers:

1

I have a DataTemplate defined as follows:

I am accessing it at runtime using the code below:

  else
                {
                    template = (DataTemplate)FindResource("GridViewTextBlockDataTemplate");

                    var textblock = (TextBlock) template.LoadContent();
                    textblock.Text = "bye";

                    //textblock.SetBinding(TextBlock.TextProperty, new Binding("[" + current.Key + "]"));
                }

                var column = new GridViewColumn
                                 {
                                     Header = current.Key,
                                     CellTemplate = template  
                                 };

                                gridView.Columns.Add(column);
            }

And now I want to change the textblock property to something how can I do that? It always appears to be blank.

A: 

A DataTemplate is a template for creating the content. When calling LoadContent on the template, it creates the content defined by that template. Therefore, when you make changes to the TextBlock, it is only being applied to that one instance of the content, and not to the DataTemplate itself.

I'm assuming you need to do this to generate a binding based on a property passed in to the function. You can do this by generating the Template directly in code. It is a lot harder to understand than XAML, but this should do the trick:

    private DataTemplate GenerateTextBlockTemplate(string property)
    {
        FrameworkElementFactory factory = new FrameworkElementFactory(typeof(TextBlock));
        factory.SetBinding(TextBlock.TextProperty, new Binding(property));

        return new DataTemplate { VisualTree = factory };
    }
Abe Heidebrecht
Thanks! I was using FrameworkElementFactory but then I need to access properties like TreeView.Items property which is not available as a dependency property.
azamsharp
Well, the FrameworkElementFactory is how the XAML parser creates the DataTemplates... So if you can do it in XAML, you can do it in code. What exactly do you need to do that this isn't working out for you?
Abe Heidebrecht