使模板通用

时间:2013-11-21 17:36:29

标签: c# wpf datagrid

我有一个WPF DataGrid,它有一些单元格(而不是列)需要根据viewmodel中的某些值从readonly切换到editable。我能找到的唯一方法(经过大量搜索后)是这样的:

<UserControl.Resources>
    <DataTemplate x:Key="CellTemplate">
        <TextBlock
            Text="{Binding MyValue}"
            Style="{StaticResource CellTextBlockNumber}" />
    </DataTemplate>

    <DataTemplate x:Key="ReadonlyCellTemplate">
        <TextBlock
            Text="{Binding MyValue}"
            Style="{StaticResource CellTextBlockNumberReadonly}" />
    </DataTemplate>

    <DataTemplate x:Key="EditableCellTemplate">
        <TextBox
            Text="{Binding MyValue}"
            Style="{StaticResource CellTextBoxNumber}"
            FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}" />
    </DataTemplate>
</UserControl.Resources>

各种风格只是设置背景颜色等。

然后在DataGrid.Columns部分:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ContentPresenter x:Name="Presenter" Content="{Binding}" ContentTemplate="{StaticResource CellTemplate}" />
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding EnableCells}" Value="False">
                    <Setter TargetName="Presenter" Property="ContentTemplate" Value="{StaticResource ReadonlyCellTemplate}" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>

    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ContentPresenter x:Name="Presenter" Content="{Binding}" ContentTemplate="{StaticResource EditableCellTemplate}" />
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding EnableCells}" Value="False">
                    <Setter TargetName="Presenter" Property="ContentTemplate" Value="{StaticResource ReadonlyCellTemplate}" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

基本上,ContentPresenter的ContentTemplate基于DataTrigger被换出。

这适用于单个列,但我有大约10个需要此功能的列(在单元级别),如果我不需要,我真的不想为每列创建3个模板。有没有办法修改它,以便模板绑定到我可以在DataGridColumn级别指定的“泛型”值(而不是MyValue)?

1 个答案:

答案 0 :(得分:1)

使用您已有的模板,只更改文本块中的文本应为Text="{Binding }"

然后在内容控件中(在单元格/编辑模板中),让内容绑定如下:

Content="{Binding MyValue}"

所以现在你只有三个模板,每个列你可以为内容控件的内容指定不同的绑定。