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