如何将DataGridTemplateColumn绑定到列值而不是行值?

时间:2010-11-05 17:10:34

标签: wpf binding wpfdatagrid

我有一个属性网格控件,它有许多单元格编辑器,可以使用CellEditorTemplateSelector自动应用。每个属性网格行都绑定一个简单的PropertyItemViewModel。

现在,我正在尝试重用所有这些单元格编辑器并将其呈现在DataGrid中,以便能够并排比较多个对象值。所以我添加了一个PropertiesRow对象,其中包含PropertyItemViewModel列表(与上面的属性网格相同)。

为了呈现每个单元格,我有一个简单的数据模板,它使用与属性网格相同的模板选择器。

<DataTemplate x:Key="CellDataTemplate">
    <ContentControl
         Content="{Binding Mode=OneWay}"
         ContentTemplateSelector="{StaticResource CellEditorTemplateSelector}" />            
</DataTemplate>

但是,为了使其工作,模板需要PropertyItemViewModel(而不是PropertiesRow),因此我必须以某种方式通过从PropertiesRow.PropertyItems[columnIndex]获取正确的绑定来提供它。因此,当我通过代码添加列时,我尝试了这样的事情:

void AddColumns()
{
    foreach (Property shownProperty in _ShownProperties)
    {
        _DataGrid.Columns.Add(new DataGridTemplateColumn()
        {
            Header = shownProperty.Name;
            Binding = new Binding("PropertyItems[" + index + "]");
            CellTemplate = (DataTemplate) FindResource("CellDataTemplate");
        });
    }
}

但是,DataGridTemplateColumn没有Binding属性!所以我尝试为每一列生成一个中间DataTemplate,但这开始变得非常复杂,我觉得必须有一种更简单的方法。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我上面的XAML遇到了麻烦,但是我得到了这个。不得不设置Path=''或编译器不满意。

Content="{Binding Mode=OneWay, Path='',
                  RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridCell, 
                                  AncestorLevel=1}, 
                  Converter={StaticResource CellToColumnValueConverter}}"

答案 1 :(得分:0)

我找到了一种方法,MVVM标准并不干净,因为它直接与DataGridCells一起使用,但它的工作正常。

我按原样保留了我的单元格模板,除了不将它绑定到我的PropertiesRow对象,它没有指示我们所在的列,我使用相对源绑定绑定到父DataGridCell:

<DataTemplate x:Key="CellDataTemplate">
    <ContentControl
        Content="{Binding Mode=OneWay,
     RelativeSource={RelativeSource FindAncestor, 
                              AncestorType={x:Type Controls:DataGridCell}},
     Converter={StaticResource CellToColumnValueConverter}}}"
        ContentTemplateSelector="{StaticResource CellEditorTemplateSelector}" />            
</DataTemplate>

然后我添加了一个CellToColumnValueConverter,它使用DataGridCell并使用列的索引将其转换为PropertyItem:

public class CellToColumnValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DataGridCell cell = (DataGridCell) value;
        int displayIndex = cell.Column.DisplayIndex;
        PropertiesRow r = (PropertiesRow) cell.DataContext;
        return r.PropertyItems[displayIndex];
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}