2011-09-21 57 views
2

我有DataGridTemplateColumnCellTemplateSelector不会选择模板自动

 <DataTemplate x:Key="firstTemplate"> 
     <UniformGrid Grid.Column="1" Columns="2"> 
      <Label Background="{Binding Path=Color, 

            Converter={StaticResource gradientBrush}}" 
         Content="{Binding Path=Value}" 
         Style="{StaticResource WhiteCellLabelStyle}" 
         Visibility="Visible" />     
     </UniformGrid> 
    </DataTemplate> 

    <DataTemplate x:Key="secondTemplate"> 
     <UniformGrid Grid.Column="1" Columns="{Binding Converter={StaticResource getColumnsAmount}}"> 
      <Label Background="{Binding Path=ColorData_1.Color, 
             Converter={StaticResource gradientBrush}}" 
        Content="{Binding Path=ColorData_1, 
            Converter={StaticResource ValueRangeConvert}}" 
        Style="{StaticResource WhiteCellLabelStyle}" 
        Visibility="{Binding Path=ColorData_1.IsSelected, 
             Converter={StaticResource boolConvert}}" /> 
      <Label Background="{Binding Path=ColorData_2.Color, 
             Converter={StaticResource gradientBrush}}" 
        Content="{Binding Path=ColorData_2, 
            Converter={StaticResource ValueRangeConvert}}" 
        Style="{StaticResource WhiteCellLabelStyle}" 
        Visibility="{Binding Path=ColorData_2.IsSelected, 
             Converter={StaticResource boolConvert}}" /> 
      <Label Background="{Binding Path=ColorData_3.Color, 
             Converter={StaticResource gradientBrush}}" 
        Content="{Binding Path=ColorData_3, 
            Converter={StaticResource ValueRangeConvert}}" 
        Style="{StaticResource WhiteCellLabelStyle}" 
        Visibility="{Binding Path=ColorData_3.IsSelected, 
             Converter={StaticResource boolConvert}}" />    
     </UniformGrid>   
    </DataTemplate> 


    <DataGrid Name="dgLegend" 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Stretch" 
       AutoGenerateColumns="False" 
       Background="{x:Null}" 
       HeadersVisibility="None" 
       IsHitTestVisible="True" 
       IsReadOnly="True" 
       ItemsSource="{Binding}"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Width="Auto" 
            Header="exp" 
            IsReadOnly="True"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Border Background="{Binding Path=Color> 
          <Label Content="{Binding Path=Color}" /> 
         </Border> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      <DataGridTemplateColumn Width="*" Header="Range"> 
       <DataGridTemplateColumn.CellTemplateSelector> 
        <local:LegendDisplayModeTemplateSelector 
                  firstTemplate="{StaticResource firstTemplate}" 
                  secondTemplate="{StaticResource secondTemplate}" /> 
       </DataGridTemplateColumn.CellTemplateSelector> 
      </DataGridTemplateColumn> 

     </DataGrid.Columns> 
    </DataGrid> 

我TemplateSelector

public class LegendDisplayModeTemplateSelector : DataTemplateSelector 
    { 
     public DataTemplate firstTemplate 
     { 
      get; 
      set; 
     } 
     public DataTemplate secondTemplate 
     { 
      get; 
      set; 
     } 

     public DisplayMode displayMode 
     { 
      get; 
      set; 
     } 

     public override DataTemplate SelectTemplate(object item, DependencyObject container) 
     { 
      TSOptions opts = (TSOptions)item; 
        //some other code      
     } 
    } 

的问题是在SelectTemplate项目(对象项目,DependencyObject的容器)总是两个模板得到null

+0

这将帮助,如果你向我们展示你对什么样的结合。 ItemsSource =“{Binding}” 什么是当前的DataContext? – cunningdave

+0

我想我只是将ItemsSource绑定到一个通用列表,我没有做任何有关DataContext的事情,它为什么该项目为null? – CodingTT

回答

4

我找到了答案。

http://social.msdn.microsoft.com/Forums/en/wpf/thread/b47ac38a-077f-41da-99b1-8b88add693d8?prof=required

他用这种方式:

 class UserCellEdit : DataTemplateSelector 
    { 
     public override DataTemplate 
      SelectTemplate(object item, DependencyObject container) 
     { 
      ContentPresenter presenter = container as ContentPresenter; 
      DataGridCell cell = presenter.Parent as DataGridCell; 
      Guideline_node node = (cell.DataContext as Guideline_node); 

//,...... etc. the rest of the code 
     } 
    } 
1

我用这个解决方案:

public class EmployeeListDataTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     FrameworkElement element = container as FrameworkElement; 

     if (element != null && item != null && item is Employee) 
     { 
      Employee employee = item as Employee; 

     if (employee.Place == "UK") 
      return element.FindResource("UKdatatemp") as DataTemplate; 
     else 
       return element.FindResource("Otherdatatemp") as DataTemplate; 
     } 
     return null; 
    } 
}