2010-05-12 28 views
5

Quiero tener un borde alrededor de ListViewItem (fila en mi caso). Origen y columnas ListView generados durante Runtime. En XAML tengo esta estructura:Cómo puedo agregar borde a ListViewItem, ListView en modo GridView

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

en tiempo de ejecución Ato vista de lista a DataTable, añadiendo columnas necesarias y fijaciones:

 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()); 

así que quiero añadir borde alrededor de cada fila, y establecer el comportamiento de la frontera (color, etc.) con DataTriggers (por ejemplo, si el valor en la primera columna = "Visible", establece el color del borde en negro). ¿Puedo poner borde a través de DataTemplate en ItemTemplate? Sé solución, donde manipulas con CellTemplates, pero realmente no me gusta. Quiero algo así si esto es posible.

<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> 

Respuesta

11

Vas a tener que fijar su frontera en el 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> 

Ahora se puede definir este estilo en su ListView

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

Gracias! Experimenté en DataTemplate de muchas maneras, todo lo que tuve que hacer fue cambiarlo a ControlTemplate, oh una cosa más, con GridView, debería usar GridViewRowPresenter en su lugar :) – Andrew

10

Suponiendo que estés usando un ListView con una GridView configurado como Vista, luego ListView no muestra líneas verticales u horizontales de forma predeterminada.

Si desea agregar líneas horitzontales a continuación, puede cambiar el borde de la ListViewItem, por ejemplo:

<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

"here"? ¿Donde es aquí? –

Cuestiones relacionadas