Я не знаю, является ли это "лучшим" способом, так как он остается довольно уродливым, но я лично сделал это так:
- сделать шаблон в xaml
- использовать мультибинд, который принимает текущую привязку + привязку к столбцу, чтобы получить «правильный» dataContext (т.е. ячейку вместо строки)
- используйте конвертер для этой привязки, чтобы получить значение свойства, которое вам нравится, при необходимости добавьте параметр, если у вас есть много свойств для извлечения.
например: (извините, я не адаптировал свой код в соответствии с вашим проектом, но вы сможете сделать это самостоятельно)
вот мой шаблон данных:
<DataTemplate x:Key="TreeCellTemplate">
<Grid>
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5,0,0,0">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource RowColumnToCellConverter}" ConverterParameter="Text">
<Binding />
<Binding RelativeSource="{RelativeSource AncestorType=DataGridCell}" Path="Column" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Grid>
</DataTemplate>
и вот мой конвертер:
public class RowColumnToCellConverter : MarkupExtension, IMultiValueConverter
{
public RowColumnToCellConverter() { }
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
XwpfRow row = values[0] as XwpfRow;
XwpfTreeColumn column = values[1] as XwpfTreeColumn;
if (row == null || column == null) return DependencyProperty.UnsetValue;
TreeCell treeCell = (TreeCell)row[column.DataGrid.Columns.IndexOf(column)];
switch ((string)parameter)
{
case "Text": return treeCell.Text;
case "Expanded": return treeCell.Expanded;
case "ShowExpandSymbol": return treeCell.ShowExpandSymbol;
case "CurrentLevel": return new GridLength(treeCell.CurrentLevel * 14);
default:
throw new MissingMemberException("the property " + parameter.ToString() + " is not defined for the TreeCell object");
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new RowColumnToCellConverter();
}
}
это сохраняет модель MVVM, и я предпочитаю такой способ работы, потому что я действительно не люблю использовать парсеры xaml для создания "динамических" шаблонов данных, но это все еще уродливый хак с моей точки зрения.
Хотелось бы, чтобы ребята из MS дали нам способ получать ячейки вместо строк в качестве dataContexts, чтобы иметь возможность генерировать шаблонные столбцы на лету ...
надеюсь, это поможет
РЕДАКТИРОВАТЬ: В вашем случае конвертер должен быть намного проще на самом деле (вы можете вернуть экземпляр ячейки напрямую, если я не ошибаюсь, и вам не нужны какие-либо параметры), но Тем не менее, я оставил более сложную версию, на случай, если у кого-то еще возникнет похожая проблема