これはかなりいままなので、これが「より良い」方法であるかどうかはわかりませんが、個人的には次のようにしました。
- テンプレートを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 として行ではなくセルを取得する方法を提供してくれることを願っています...
お役に立てれば
編集:あなたの場合、コンバーターは実際にはもっと単純でなければなりません(私が間違っていなければ、セルのインスタンスを直接返すことができ、パラメーターは必要ありません)が、それでもより複雑なバージョンを残しました。他の誰かが同様の問題を抱えている場合に備えて