我不知道这是否是一种“更好”的方式,因为这仍然很丑陋,但我个人确实喜欢这样:
- 在 xaml 中制作模板
- 使用采用当前绑定+绑定到列的多重绑定来获取“正确”的数据上下文(即:单元格而不是行)
- 在此绑定上使用转换器来获取您喜欢的属性的值,如果您有许多要检索的属性,则可以选择添加一个参数。
例如:(对不起,我没有调整我的代码以适应你的项目,但你应该可以从那里自己做)
这是我的数据模板:
<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 解析器来制作“动态”数据模板,但从我的角度来看,它仍然是一个丑陋的 Hack。
我希望 MS 的人能给我们一种方法来获取单元格而不是行作为 dataContexts,以便能够动态生成模板列......
希望这可以帮助
编辑:在您的情况下,转换器实际上应该简单得多(如果我没记错的话,您可以直接返回单元格的实例,并且您不需要任何参数),但我仍然留下了更复杂的版本,只是如果其他人有类似的问题