我有一个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)?
答案 0 :(得分:1)
使用您已有的模板,只更改文本块中的文本应为Text="{Binding }"
。
然后在内容控件中(在单元格/编辑模板中),让内容绑定如下:
Content="{Binding MyValue}"
所以现在你只有三个模板,每个列你可以为内容控件的内容指定不同的绑定。