Domanda

Nel mio Silverlight 3 controllo dell'utente sto mostrando un base DataGrid controllo. ho bisogno di generare le colonne a livello di programmazione come segue:

Style headerStyle = (Style)Resources["ColumnHeaderStyle"];
DataGridTextColumn col = new DataGridTextColumn();
col.HeaderStyle = headerStyle;
dataGrid.Columns.Add(col);

Lo stile è definito come segue:

<Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" 
       TargetType="prim:DataGridColumnHeader">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Loaded="StackPanel_Loaded">
                    <TextBlock Text="{Binding Name}" />
                    <TextBlock Text="{Binding Data}" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

voglio Impostare il contesto dati dell'intestazione su un oggetto "keader" (con proprietà "Nome" e "Data" a cui si fa riferimento nel datatemplate). Sfortunatamente, non posso usare l'evento stackpanel_load come suggerito altrove, perché il gestore di eventi viene chiamato anche quando l'utente avvia un'operazione di trascinamento della colonna.

Qual è il modo corretto di impostare il datacontext di un'intestazione della colonna DataGrid?

È stato utile?

Soluzione

Si scopre che si può usare il Proprietà intestazione (che è di tipo oggetto) come il DataContext per DataTemplate (impostata come mostrato sopra):

Style headerStyle = (Style)Resources["ColumnHeaderStyle"];
DataGridTextColumn col = new DataGridTextColumn();
col.HeaderStyle = headerStyle;
col.Header = myHeaderDataContext; // DataContext for ColumnHeaderStyle
dataGrid.Columns.Add(col);

Altri suggerimenti

Ecco come lo faresti in XAML (funziona in WPF; non so se funziona in SL)

<DataGridTextColumn Binding="{Binding Path=Discount}">
    <DataGridTextColumn.HeaderStyle>
        <Style TargetType="DataGridColumnHeader">
            <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=DataContext.DiscountHeader}" />
        </Style>
    </DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>

Sulla base della risposta di Matt, ho escogitato la soluzione di vincolo l'intestazione sul DataGridCellsPanel che in snoop sembrava avere il contesto dei dati corretto:

  <DataGridTemplateColumn.HeaderStyle>
     <Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource CenterAlignedColumnHeaderStyle}">
         <Setter Property="Content" Value="{Binding Path=DataContext.Location, RelativeSource={RelativeSource AncestorType={x:Type DataGridCellsPanel}}}" />
      </Style>
  </DataGridTemplateColumn.HeaderStyle>

E questo non è invadente nel modo in cui è ancora possibile ereditare dalle intestazioni in stile personalizzato (vedi Esemple sopra) o all'evento lo stile di intestazione della colonna di base:

 <DataGridTemplateColumn.HeaderStyle>
     <Style TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
     <Setter Property="Content" Value="{Binding Path=DataContext.Location, RelativeSource={RelativeSource AncestorType={x:Type DataGridCellsPanel}}}" />
     </Style>
 </DataGridTemplateColumn.HeaderStyle>

Questa soluzione ha il vantaggio di essere XAML puro e pulito e di riferirsi all'antenato più vicino che tiene il datacontext corretto piuttosto che provare a raggiungere il datacontext dei migliori elementi della gerarchia come UserControl.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top