2010-05-12 15 views
5

Desidero avere un bordo attorno a ListViewItem (riga nel mio caso). Sorgente di ListView e colonne generate durante il runtime. In XAML ho questo struttura:Come posso aggiungere il bordo a ListViewItem, ListView in modalità GridView

<ListView Name="listViewRaw"> 
    <ListView.View> 
     <GridView> 
     </GridView> 
    </ListView.View> 
</ListView> 

durante il runtime mi legano ListView a DataTable, l'aggiunta di colonne necessarie e attacchi:

 var view = (listView.View as GridView); 
     view.Columns.Clear(); 
     for (int i = 0; i < table.Columns.Count; i++) 
     { 
      GridViewColumn col = new GridViewColumn(); 
      col.Header = table.Columns[i].ColumnName; 
      col.DisplayMemberBinding = new Binding(string.Format("[{0}]", i.ToString())); 
      view.Columns.Add(col); 
     } 

     listView.CoerceValue(ListView.ItemsSourceProperty); 

     listView.DataContext = table; 
     listView.SetBinding(ListView.ItemsSourceProperty, new Binding()); 

quindi voglio aggiungere bordo attorno a ogni riga, e il comportamento di frontiera set (colore ecc.) con DataTriggers (ad esempio se il valore nella prima colonna = "Visibile", imposta il colore del bordo su nero). Posso inserire il bordo attraverso DataTemplate in ItemTemplate? Conosco la soluzione, dove si manipola con CellTemplates, ma non mi piace molto. Voglio qualcosa di simile se questo è possibile.

<DataTemplate> 
    <Border Name="Border" BorderBrush="Transparent" BorderThickness="2"> 
     <ListViewItemRow><!-- Put my row here, but i ll know about table structure only during runtime --></ListViewItemRow> 
    </Border> 
</DataTemplate> 

risposta

11

Dovrete impostare il confine nel ControlTemplate

<Style x:Key="BorderedItem" TargetType="ListViewItem"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ListViewItem"> 
     <Border Name="Border" BorderBrush="Transparent" BorderThickness="2"> 
      <ContentPresenter /> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Ora è possibile impostare questo stile nel vostro ListView

<ListView ItemContainerStyle="{StaticResource BorderedItem}" /> 
+1

Grazie! Ho sperimentato su DataTemplate in molti modi, tutto quello che dovevo fare era passare a ControlTemplate, oh un'altra cosa, con GridView, dovrei usare GridViewRowPresenter invece :) – Andrew

10

Supponendo che si sta utilizzando un ListView con un GridView è impostato come Vista, quindi ListView non mostra linee verticali o orizzontali per impostazione predefinita.

Se si desidera aggiungere linee horitzontal quindi è possibile modificare il bordo sul ListViewItem, per esempio:

<ListView ...> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Setter Property="BorderBrush" Value="LightGray" /> 
      <Setter Property="BorderThickness" Value="0,0,0,1" /> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn ... /> 
     </GridView> 
    </ListView.View> 
    ... 
+1

"qui"? Dov'è qui? –

Problemi correlati