Как извлечь элемент из DataTemplate и привязать к нему? - PullRequest
0 голосов
/ 15 апреля 2011

Я пытаюсь получить указатель на элемент в моем DataTemplate в коде. Я создаю серию DataGridTemplateColumns в коде, который я затем назначаю сетке. Я хочу иметь возможность получить DataTemplate из xaml, найти мой элемент и привязать к этому конкретному элементу.

Вот короткий пример кода, которого я пытаюсь достичь:

<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 на лету и применить его к сетке данных. Поскольку я не знаю свойства для привязки, пока источник не будет представлен мне, я не могу создать DataTemplate, который вложен в себя, и эта привязка уже встроена. Например:

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

Так что я вынужден создать набор DataGridTemplateColumn во время выполнения, найти DataTemplate в моих ресурсах, а затем попытаться привязать этот столбец к свойству (например, LastName) в моем источнике данных.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2012

Мое решение проблемы выглядит примерно так:

 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;
    }
0 голосов
/ 04 мая 2011

Я бы подошел к этому через 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, но в этом случае это не кажется необходимым (если ваша проблема не является более сложной).

...