我有一个DataGrid,其中包含我从服务器获取的动态数据(自定义DataRows的集合)。 DataRow有一个索引器和一个属性Data,它返回绑定的整个数据行(你会在下面看到)
我以这样的方式创建DataGrid的每一列:
DataGridTextColumn column = new DataGridTextColumn();
Binding binding = new Binding("Data[" + i.ToString() + "]");
binding.Mode = BindingMode.TwoWay;
binding.Converter = _dataContextSelector;
binding.ConverterParameter = dataColumn;
column.Binding = binding;
我需要做什么:我需要根据转换器返回的数据以不同的方式显示DataGridCells的内容。
我编写了模板选择器(它继承了ContentControl)并以这种方式将它放在DataGridCell的ContentTemplate属性中:
<Style TargetType="sdk:DataGridCell">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<view:DataGridCellTemplateSelector Content="{Binding}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
在这种情况下,我将整个DataRow作为我的选择器的内容(不能找不到原因,因为列绑定在行的一个项目上)并且我的转换器未被调用。整个datarow是默认的DataContext,所以我想,我的代码隐藏绑定在这种情况下完全忽略。
所以我试图将我的模板选择器放到DataGridCell的ControlTemplate中:
<Style TargetType="sdk:DataGridCell">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="sdk:DataGridCell">
<view:DataGridCellTemplateSelector Content="{TemplateBinding Content}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
但是在这种情况下,我的TextBlock带有空文本作为我的选择器的内容( SHOCKED )。内容更改后调用Converter。 如何创建模板选择器,它将根据我的绑定数据选择模板(调用转换器后)?
答案 0 :(得分:0)
隐式数据模板看起来像那样(注意,它们是没有x:Key的资源):
<UserControl.Resources>
<DataTemplate DataType="ViewModel:Contact">
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding City}"/>
</StackPanel>
</DataTemplate>
</UserControl.Resources>