2010-08-20 13 views
10

Penso di avere un obiettivo piuttosto semplice ma non riesco a raggiungerlo.ItemsControl con intestazione statica

Tutto ciò che voglio ottenere è disporre di un oggetto ItemsControl (perché non desidero la funzionalità di selezione di un elenco) con un'intestazione. Preferibilmente un'intestazione statica.

Attualmente sto usando una griglia per l'intestazione e quindi copio quella griglia in ItemTemplate (DataTemple) di ItemsControl e quindi li posiziono uno sopra l'altro in una griglia. Funziona un po 'ma non sempre si allinea bene ecc.

Ho quindi trovato il HeaderedItemsControl che ho pensato fosse un'idea geniale ma non riesco a farlo funzionare, semplicemente non mostra affatto l'intestazione. Ho provato quanto segue;

  • Appena immissione del testo in "Intestazione" del Xaml
  • Posizionando una griglia con TextBlocks con testo statico all'interno del tag ItemsControl.Header
  • Posizionamento della griglia all'interno HeaderTemplate (DataTemplate) e vincolante per un oggetto semplice

Sto facendo tutto questo in Blend in un piccolo progetto prima di spostarlo nell'app di produzione e sto solo utilizzando una semplice fonte di dati di esempio che ho creato.

Potrei mancare completamente la barca qui, ma qualsiasi aiuto sarebbe apprezzato.

Il mio codice attuale è la seguente, prima è il mio HeaderedItemsControl

<HeaderedItemsControl Header="HeaderedItemsControl" 
     ItemsSource="{Binding Collection, Mode=Default}" 
     ItemTemplate="{DynamicResource ItemsControlDataTemplate}" 
     HeaderTemplate="{DynamicResource ItemsControlHeaderDataTemplate}"/> 

poi ho un ItemTemple che funziona come previsto

<DataTemplate x:Key="ItemsControlDataTemplate"> 
     <Grid d:DesignWidth="268"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.754*"/> 
       <ColumnDefinition Width="0.246*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding Property1, Mode=Default}" TextWrapping="Wrap" d:LayoutOverrides="Height" HorizontalAlignment="Stretch" Margin="0" /> 
      <TextBlock Text="{Binding Property2, Mode=Default}" TextWrapping="Wrap" d:LayoutOverrides="Height" Grid.Column="1" HorizontalAlignment="Left" Margin="0" /> 
     </Grid> 
    </DataTemplate> 

e poi il colpo di testa che viene con aria di sfida oppone il suo lavoro etica, l'ho provato con binding e con solo testo nella proprietà TextBlock.Text

<DataTemplate x:Key="ItemsControlHeaderDataTemplate"> 
     <Grid d:DesignWidth="268"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.754*"/> 
       <ColumnDefinition Width="0.246*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding Header.Header1, Mode=Default, Source={StaticResource SampleDataSource6}}" TextWrapping="Wrap" HorizontalAlignment="Stretch" Margin="0"/> 
      <TextBlock Text="{Binding Header.Header2, Mode=Default, Source={StaticResource SampleDataSource6}}" TextWrapping="Wrap" d:LayoutOverrides="Height" Grid.Column="1" HorizontalAlignment="Left" Margin="0"/> 
     </Grid> 
    </DataTemplate> 

risposta

9

HeaderedItemsControl non ha uno stile predefinito, quindi è solo utilizzando il modello dalla classe base ItemsControl, che non rende qualsiasi intestazione. Viene utilizzato solo dal framework come classe base per MenuItem, ToolBar e TreeViewItem, che definiscono i propri modelli. Si potrebbe creare un modello che include un ContentPresenter per l'intestazione:

<HeaderedItemsControl ItemsSource="{Binding}" Header="Some text"> 
    <HeaderedItemsControl.Template> 
     <ControlTemplate TargetType="HeaderedItemsControl"> 
      <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
       <DockPanel> 
        <ContentPresenter DockPanel.Dock="Top" ContentSource="Header" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </DockPanel> 
      </Border> 
     </ControlTemplate> 
    </HeaderedItemsControl.Template> 
</HeaderedItemsControl> 

Se si sta utilizzando solo in un posto, potrebbe essere più facile da usare una pianura ItemsControl e comprendono l'intestazione direttamente nel modello di controllo .

Inoltre, sembra che tu stia cercando di avere due griglie le cui colonne hanno la stessa larghezza. Si consiglia di guardare Grid Size Sharing in WPF. Se si imposta Grid.IsSharedSizeScope su un controllo padre, è possibile impostare SharedSizeGroup su colonne di griglie diverse per assegnare loro la stessa larghezza.

+0

Grazie signore, la vostra risposta mi ha davvero aiutato. Alla fine ho creato uno stile per HeaderedItemsControl e aggiunto ContentPresenter come suggerito con ContentSource = l'attributo header. In questo modo posso usarlo su tutti gli ItemsControl all'interno dell'app e aggiungere semplicemente una griglia con TextBlock nel tag HeaderedItemsControl.Header. wrt il tuo suggerimento sulla condivisione Grid Size, lo testerò ma non sono sicuro che funzionerà come l'una griglia è nel DataTemplate e l'altra sarà nell'intestazione del ItemsControl ma la testerò e darò un feedback –

0

È arrivato qualcosa di simile ieri - per HeaderedContentControl, prova ad impostare l'intestazione e non la proprietà HeaderTemplate.

Ho trovato impossibile ottenere i binding tramite l'HeaderTemplate: il contenuto era vincolante. Sarei molto interessato se qualcuno spiegasse il ragionamento.

Spero che la mia soluzione alternativa sopra aiuti.

Chris

Problemi correlati