DataGrid CellTemplate多个属性

时间:2013-09-19 11:01:17

标签: wpf templates binding properties datagrid

我有一个带有CellTemplate的DataGrid,我通过PropertyDescriptors动态创建列。我正在使用这种方法:http://paulstovell.com/blog/dynamic-datagrid列生成有效,正确的内容到达正确的单元格。

我的问题在于我从ex更改提供给单元格的内容。 'string'或'int'到包含多个属性的自定义类。 CellTemplate不会绑定到contentclass中的属性。

内容类:

    public class ContentWrapper
    {
        public Color Color{ get; set; }
        public String Text { get; set; }
        public String Comment { get; set; }
    }

cellTemplate:

    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <Grid ToolTip="{Binding Comment}"
                              Background="{Binding Color, Converter={StaticResource ColorToBrushConverter}}">
                            <TextBlock Text="{Binding Text}"
                                       VerticalAlignment="Bottom"
                                       HorizontalAlignment="Left"/>                                                                
                            <Polygon Visibility="{Binding Comment, Converter={StaticResource CommentVisibleConverter}, FallbackValue=Hidden}"
                                     HorizontalAlignment="Right"
                                     Points="0,0 6,0 6,6"
                                     VerticalAlignment="Top">
                                <Polygon.Fill>
                                    <SolidColorBrush Color="Red" />
                                </Polygon.Fill>
                            </Polygon>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.Resources>

如何让CellTemplate能够支持自定义类并绑定到它的属性? 或者有更简单的方法吗?

修改 列生成是这样的:

    private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        var property = e.PropertyDescriptor as Property;
        if (property != null)
        {
            var binding = new Binding() { Path = new PropertyPath(property), Mode = property.IsReadOnly ? BindingMode.OneWay : BindingMode.TwoWay };
            var dataGridBoundColumn = e.Column as DataGridBoundColumn;
            if (dataGridBoundColumn != null)
                dataGridBoundColumn.Binding = binding;
            else
            {
                var dataGridComboBoxColumn = e.Column as DataGridComboBoxColumn;
                if (dataGridComboBoxColumn != null)
                    dataGridComboBoxColumn.SelectedItemBinding = binding;
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

为解决问题做得好。

  

我不是试图回答你的问题,只是简单地提出一些建议:

似乎Bind内部尝试DataGrid ControlTemplate到您的数据实例属性......这不是真正的用途。 Template属性允许我们定义控件的外观。您应该将商品Style和数据Binding放在定义数据项呈现方式的ItemsTemplate中。这是一个重要的区别。

来自MSDN:

  

ItemsTemplate属性 - 获取或设置用于显示每个项目的DataTemplate。

     

Template Property - 获取或设置控件模板。 ControlTemplate指定Control

的外观

答案 1 :(得分:0)

D'oh ..在这个问题上工作了2天,并且在我问到解决问题后1小时。

我将Column类型更改为嵌套类型的DataGridTemplateColumn,并手动加载单元格模板和绑定。