2010-07-29 14 views
5
<ListView ItemsSource="{Binding MyData}"> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn Header="col1" DisplayMemberBinding="{Binding Path=value1}"> 
     <GridViewColumn.CellTemplate> 
      <DataTemplate> 
      <TextBlock TextAlignment="Right" Text="{Binding Path=value1}"/> 
      </DataTemplate> 
     </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
     <GridViewColumn Header="col2"> 
     <GridViewColumn.CellTemplate> 
      <DataTemplate> 
      <TextBlock TextAlignment="Center" Text="{Binding Path=value2}"/> 
      </DataTemplate> 
     </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
     <GridViewColumn Header="col3" DisplayMemberBinding="{Binding Path=value3}"/> 
    </GridView> 
    </ListView.View> 
<ListView ItemsSource="{Binding MyData}"> 

Col1 se supone que está alineado a la derecha. (No funciona)
Se supone que col2 está alineado en el centro. (Trabajo)
Se supone que col3 está alineado a la izquierda. (Trabajo)WPF ListView: alineando el texto en las columnas seleccionadas

¿Hay alguna razón por la que DisplayMemberBinding esté anulando CellTemplate? Si es así, ¿hay una solución para esto (mientras se sigue utilizando DisplayMemberBinding)?

Edit: terminó implementarlo como este:

<Window xmlns:util="clr-namespace:TestProject.Util"> 
    <Window.Resources> 
    <Style TargetType="ListViewItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    </Style> 
    <Style TargetType="GridViewColumnHeader"> 
     <Setter Property="HorizontalContentAlignment" Value="Left"/> 
    </Style> 
    <DataTemplate x:Key="value1Template"> 
     <TextBlock TextAlignment="Right" Text="{Binding Path=value1}"/> 
    </DataTemplate> 
    <DataTemplate x:Key="value2Template"> 
     <TextBlock TextAlignment="Right" Text="{Binding Path=value2}"/> 
    </DataTemplate> 
    </Window.Resources> 
    <Grid> 
    <ListView ItemsSource="{Binding MyData}" IsSynchronizedWithCurrentItem="True" util:GridViewSort.Command="{Binding SortCommand}"> 
     <ListView.View> 
     <GridView> 
      <GridViewColumn Header="col1" CellTemplate="{StaticResource value1Template}" util:GridViewSort.PropertyName="value1"/> 
      <GridViewColumn Header="col2" CellTemplate="{StaticResource value2Template}" util:GridViewSort.PropertyName="value2"/> 
     </GridView> 
     </ListView.View> 
    </ListView> 
    </Grid> 
</Window> 

En el código subyacente:

private RelayCommand sortCommand; 
public ICommand SortCommand { get { return sortCommand ?? (sortCommand = new RelayCommand(Sort)); } } 
private void Sort(object param) 
{ 
    var propertyName = param as string; 
    var view = CollectionViewSource.GetDefaultView(MyData); 
    var direction = ListSortDirection.Ascending; 
    if (view.SortDescriptions.Count > 0) 
    { 
    var currentSort = view.SortDescriptions[0]; 
    if (currentSort.PropertyName == propertyName) 
     direction = currentSort.Direction == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending; 
    view.SortDescriptions.Clear(); 
    } 
    if (!string.IsNullOrEmpty(propertyName)) 
    view.SortDescriptions.Add(new SortDescription(propertyName, direction)); 
} 

Respuesta

7

DisplayMemberBinding tiene la prioridad más alta. No puede usarlo combinado con CellTemplate. Consulte here en la sección de comentarios.

Si desea alinear a la derecha o al centro el contenido, debe declarar el CellTemplate con el enlace (como lo hizo) y eliminar el DisplayMemberBinding -tributo. Si también desea cambiar la alineación del encabezado de columna, también debe establecer GridViewColumn.Header -property.

+0

bien, gracias. Creo que tendré que cambiar mi seleccionadora para trabajar con algún otro valor que DisplayMemberBinding. – snurre

+0

Tal vez el siguiente enlace sea útil: http://tomlev2.wordpress.com/2009/08/04/wpf-automatically-sort-a-gridview-continued/ – HCL

+0

Sí, acabo de encontrarlo. Implementando eso ahora. ¡Gracias de nuevo! – snurre

1

Simplemente añadir la siguiente después de la etiqueta de la ventana:

<Window.Resources> 
    <Style TargetType="ListViewItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Right" /> 
    </Style> 
    </Window.Resources> 
+0

Esta parece ser la única forma de hacer que funcione para mí. Cuando lo especifico para cada plantilla de celda simplemente no funciona ... –

Cuestiones relacionadas