我有一个属性网格控件,它有许多单元格编辑器,可以使用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,但这开始变得非常复杂,我觉得必须有一种更简单的方法。
有什么建议吗?
答案 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();
}
}